1. 程式人生 > >Java演算法實現之氣泡排序及優化

Java演算法實現之氣泡排序及優化

氣泡排序,是一種很簡單的排序演算法。原理就不過多介紹了,直接入手demo。

需求:輸入一組資料,用氣泡排序進行排序。

先用最直接的方法進行排序,程式碼如下:

//對一組數進行氣泡排序
public class Bubble01 {
	public static void main(String[] args) {
		int flag = 0;//用於記錄次數
		int num[] = {1,23,54,5,21,51,41,23,15,47};//模擬輸入陣列
		for (int i = 0; i < num.length - 1; i++) {//外層迴圈,用於控制迴圈次數。一共需要迴圈n(陣列大小)-1次
			for (int j = 1; j < num.length - i; j++) {//內層迴圈,用於資料比較第一次比0~n的數第二次0~n-1……
				if(num[j] < num[j-1]){
					int temp = num[j];
					num[j] = num[j-1];
					num[j-1] = temp;
				}
				flag++;//記錄次數
			}
		}
		for (int i : num) {
			System.out.print(i + " ");//輸出目標陣列
		}
		System.out.println("\n迴圈次數:" + flag);//輸出迴圈次數
	}
}
輸出結果:
1 5 15 21 23 23 41 47 51 54 
迴圈次數:45
但是,這種效率是很低的,我們仔細想想,如果陣列是 1 2 4 3 5 6 7 8 9,按照上面的方法,第一次迴圈,在3和4交換之後,陣列變成 1 2 3 4 5 6 7 8 9,按照第一種方法來說,接下來會進行 1 2 3 4 5 6 7 8的第二次迴圈,可是我們可以明顯知道,接下來是不應該繼續下去了,已經成為了有序數列。那麼我們應該怎麼樣減少“浪費”的迴圈呢?於是我們可以設定一個迴圈標記isExit,在下一次迴圈之前,我們把這個標記設為false,如果在下一次迴圈裡面有數字的交換,那麼說明下一次迴圈之後的結果不一定是排序好的結果,直到接下來迴圈沒有出現過數字的交換的時候,那麼這次一定為排序後的序列。

理解起來很簡單,優化方式一

,程式碼如下:

//氣泡排序優化版本1
public class Bubble02 {
	public static void main(String[] args) {
		int flag = 0;//用於記錄次數
		int num[] = {1,23,54,5,21,51,41,23,15,47};//模擬輸入陣列
		boolean isExit = true;//是否繼續迴圈標誌
		int j = num.length;//下次迴圈截止位置
		while(isExit){
			isExit = false;//如果for迴圈完成之後,該標記未改變說明陣列已經為有序,則退出迴圈。
			for (int i = 1; i < j; i++) {
				if(num[i] < num[i-1]){
					int temp = num[i];
					num[i] = num[i-1];
					num[i-1] = temp;
					isExit = true;//如果for迴圈完成之後,該標記已經改變說明陣列可能還未有序,則繼續迴圈。
				}
				flag++;//記錄次數
			}
			j--;//下一次就減少一位
		}
		for (int i : num) {
			System.out.print(i + " ");//輸出目標陣列
		}
		System.out.println("\n迴圈次數:" + flag);//輸出迴圈次數
		
	}
}
輸出結果:
1 5 15 21 23 23 41 47 51 54 
迴圈次數:42
哈哈,迴圈次數確實減少了呢!但是我們再仔細想一想,陣列1 2 4 3 5 6 7 8 9,第一次迴圈交換結束後為 1 2 3 4 5 6 7 8 9,則接下來進行第二次迴圈,迴圈範圍為 1 2 3 4 5 6 7 8,按照第一種優化方式,我們會把陣列 1 2 3 4 5 6 7 8全部比一遍,發現已經沒有數字交換了,那麼應該為排序陣列了,符合了要求。但是我們第二次有必要去把 1 2 3 4 5 6 7 8全部比一遍嗎?我們交換了 4 3的位置,後面的5 6 7 8 9並沒有交換,則可以預設交換位置之後的數列為有序數列,所以第二次其實只需要看1 2 3 4 是不是有序數列就可以了,這樣也減少了大量的次數呢!

優化方式二,程式碼如下。

//氣泡排序優化版本2
public class Bubble03 {
	public static void main(String[] args) {
		int flag = 0;//用於記錄次數
		int num[] = {1,23,54,5,21,51,41,23,15,47};//模擬輸入陣列
		boolean isExit = true;//是否繼續迴圈標誌
		int j = num.length;//下次迴圈截止位置
		int k = 0;//記錄最後一次交換的位置,k之後的說明已經是排好順序的了
		while(isExit){
			isExit = false;
			for (int i = 1; i < j; i++) {
				if(num[i] < num[i-1]){
					int temp = num[i];
					num[i] = num[i-1];
					num[i-1] = temp;
					k = i;//記錄交換位置
					isExit = true;
				}
				flag++;//記錄次數
			}
			j = k;//下次迴圈的截止位置應該是為最後一次交換的位置
		}
		for (int i : num) {
			System.out.print(i + " ");//輸出目標陣列
		}
		System.out.println("\n迴圈次數:" + flag);//輸出迴圈次數
	}
}
輸出結果:
1 5 15 21 23 23 41 47 51 54 
迴圈次數:38

優化方式是自己摸索出來的,也不知道是否正確,如有不正確的地方,歡迎點評。



相關推薦

Java演算法實現氣泡排序優化

氣泡排序,是一種很簡單的排序演算法。原理就不過多介紹了,直接入手demo。 需求:輸入一組資料,用氣泡排序進行排序。 先用最直接的方法進行排序,程式碼如下: //對一組數進行氣泡排序 public class Bubble01 { public static void m

排序演算法氣泡排序及其優化

定義:每一趟都是相鄰兩個元素進行比較,將小數放在前面,大數放在後面,最終一趟走完,最大的數也就跑到最後面了。 氣泡排序是常見的一種排序方法,比較簡單,容易理解,多用於教學(>﹏<) 最壞情況下時間複雜度:O(N^2) 。 比較次數是n(n-1)/2。 注

js實現氣泡排序優化

    就排序演算法來說氣泡排序算是比較好理解的了,設想一下這樣一個上體育課的排隊的場景。體育老師要求按身高的由低到高依次排列成一隊,假設這是這學期的第一次體育課。大家剛開始都是處於亂排的狀態,假設隊伍有n個人。這時體育

氣泡排序優化(python實現

氣泡排序大家應該都很熟悉,是一個比較交換排序,時間複雜度是O(n2),之前用過java實現過,現在用python來實現一次,還有其優化 總共用了三種實現方式 話不多說,直接上程式碼,比較三種的效能------------------ #! -*- coding:utf-

圖解算法系列氣泡排序優化版)

演算法描述 在第一層迴圈中設定一個變數,只要該序列區域性有序就不需要進行排序了,提前終止迴圈。 圖解演算法 略. C/C++程式碼實現 Custom.h void BubbleSortAdvanced(int arr[], int number); Custom.cpp v

排序演算法入門氣泡排序

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!                在開發中,對一組資料進行有序地排列是經常需要做的事情,所以掌握幾種甚至更多的排序演算法是絕對有必要的本文章介紹的是排序演算法中較簡單的一種演算法:氣泡排序題外話

python(氣泡排序優化版)

#coding=utf-8 #氣泡排序 import random print("氣泡排序") print("隨機生成一個列表") list = [] for i in range(8):     num = random.choice(range(100)) &

java面試題氣泡排序(由大到小和由小到大)

public class MaoPaoTest { public static void main(String[] args) { smallToLarge(); System.out.println(---------------------------);

【一點一點寫演算法 氣泡排序

演算法描述 氣泡排序,學習演算法的時候最先接觸的,也是最簡單的排序演算法。過於簡單,兩兩比較一輪次比較下來會把較小的數字慢慢浮到上面來。 程式 #include "stdafx.h" #define N 10 int _tmain(int arg

經典演算法體會氣泡排序

通過java語法理解氣泡排序,原理是臨近的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換,這樣一趟過去後,最大或最小的數字被交換到了最後一位,然後再從頭開始進行兩兩比較交換,直到倒數第二位

排序演算法總結氣泡排序

氣泡排序(Bubble Sort,臺灣譯為:泡沫排序或氣泡排序)是一種簡單的排序演算法。它的基本思想就是兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地

js氣泡排序優化

氣泡排序的基本思想是對所有相鄰記錄的關鍵字值每一輪進行比效,如果(a[j]>a[j+1]),則將其交換,最終達到有序化。 它是穩定的排序 最壞情況: **時間複雜度為O(n^2)**是把順序的排列變成逆序,或者把逆序的數列變成順序。在這種情況下,每一次比較

C語言氣泡排序優化

1、原氣泡排序 void print_arr(int arr[], int sz) { int i = 0; for (i = 0; i < sz;i++) {

氣泡排序優化詳解

演算法思想   氣泡排序屬於一種典型的交換排序。   交換排序顧名思義就是通過元素的兩兩比較,判斷是否符合要求,如過不符合就交換位置來達到排序的目的。氣泡排序名字的由來就是因為在交換過程中,類似水冒泡,小(大)的元素經過不斷的交換由水底慢慢的浮到水的頂端。   氣泡排序的思想就是利用的比較交換,利用迴圈

圖解氣泡排序演算法優化Java實現

# 冒牌排序 ## 基本思想 **定義**:氣泡排序的英文是bubblesort,它是一種基礎的交換排序 **原理**:每次比較兩個相鄰的元素,將較大的元素交換至右端 (升序排序) **思路**:相鄰的元素兩兩比較,當一個元素大於右側相鄰元素時,交換它們的位置;當一個元素小於或等於右側相鄰元素時,位置

排序演算法氣泡排序java實現

氣泡排序介紹 基本思想就是相鄰資料交換,每次將最大或最小的數進行移動。 步驟:(1)對陣列中的各資料,依次比較相鄰的兩個元素的大小。            (2)如果前面的資料大於(小於)後面的資料,就交換這兩個資料。經過第一輪

排序演算法氣泡排序的思想以及Java實現

1 基本思想 設排序表長為n,從後向前或者從前向後兩兩比較相鄰元素的值,如果兩者的相對次序不對(A[i-1] > A[i]),則交換它們,其結果是將最小的元素交換到待排序序列的第一個位置,我們

Java實現排序演算法氣泡排序

氣泡排序的思想:將帶排序的序列兩兩進行比較,較大的一個“冒泡”,“冒泡”即如果下標為A 與B的資料比較,A 大則與B交換位置,否則就不交換位置,交換位置後,此時B的位置程式設計A,B 的下一個位置是B,兩者在進行比較,每進行一輪排序,總是較大的數排在剩下序列的最高位,也因此為

排序演算法歸併排序Java實現

一、排序演算法的分類 選擇排序(直接選擇排序,堆排序) 交換排序(氣泡排序,快速排序) 插入排序(直接插入排序,希爾排序) 歸併排序 桶式排序 基數排序 二、歸併排序的原理 歸併排序利用的是分治的思想實現的,對於給定的一組資料,利用遞迴與分治技術

歸並排序優化(Java實現)

繼續 soft local == else 歸並排序 right 數據 cal 普通歸並排序 public class MergeSort { /** * @param arr 待排序的數組 * @param left 本次歸並