氣泡排序演算法詳解及優化

2021-08-08 21:07:26 字數 1648 閱讀 7942

排序原理:比較兩個相鄰的元素,將值大的元素交換至右端,小的元素向上冒泡,這也是冒泡演算法名稱的由來。

排序流程如下:

1)對陣列中的各資料,依次比較相鄰的兩個元素大小,即第0和第1個比較,第1個和第2個比較...第n-2個和和第n-1個比較,每次比較中如

果前面的大於後面的就交換,這樣第一輪即n次比較後,最大的元素排在的最後。

2)再用同樣的方法把第0到n-2的元素重複上述過程,n-1輪結束後,便可按從小到大的順序排好資料各元素。

舉例說明:要排序陣列:int a=;   

第一輪排序:

第一次排序:101和99

比較,101

大於99

,交換位置:  99

,101,118,112,85

第二次排序:

101和

118比較,

101小於

108,不交換位置:

99,101,118,112,85

第三次排序:118

和112

比較,11

8大於11

2,交換位置:  

99,101,112,118,85

第四次排序:118和

85比較,

118大於85

,交換位置:

99,101,112,85,118

第一輪總共進行了

4次比較, 排序結果:      

99,101,112,118,85

第二輪重複上述步驟,這次參與排序的元素是0到n-2,因為第n-1個元素已在正確的位置

下面通過**進一步理解實現過程,其實對於初學者最難理解的應該是對for迴圈下標的控制。

public class bubblesort ;  

int temp=0;

//boolean complete = false;

for(int i=0;i //complete=false;

for(int j=0;jif(a[j]>a[j+1])

}system.out.println();

for(int item:a)

//if(complete==false)}}

}程式很簡單,重點解釋下,兩個for迴圈下標控制,外層for下標是0到n-2,在這裡外層迴圈只是控制迴圈次數的,當然你也可以用1到n-1,2到n-2,都是可以的,只要和內層for結合起來就可以了

再看內層for迴圈,這裡下標是從0開始,n-i-1結束,因為從0個元素開始比較,所以0容易理解,為什麼是n-i-1結束呢?這裡大家結合具體的幾個資料就容易理解了,第一輪最後一次比較是n-2和n-1,外i是0,而我們用的是(a[j]>a[j+1],最大的j=n-2也就是a.length-i-1,是小於,不能帶等於號!

1、演算法時間複雜度o(n^2),與資料好壞情況無關,即使資料本身就是從小到大排列的也就一樣!

優化方法,看**上注釋的//boolean complete = false;

2、優化原理是,當內層for迴圈沒有一次if(a[j]>a[j+1])滿足時,說明資料已排好,此時可以結束排序!

此種情況最好的情況下複雜度是一輪排序完成即結束,為o(n)

氣泡排序演算法及優化

氣泡排序是一種典型的交換排序演算法,通過交換資料元素的位置進行排序。從序列頭部開始,進行兩兩比較,根據大小交換位置,直到最後將最大 小 的資料元素交換到了佇列的隊尾,從而成為有序序列的一部分 下一次繼續這個過程,直到所有資料元素都排好序。演算法的核心在於每次通過兩兩比較交換位置,選出剩餘無序序列裡最...

氣泡排序及演算法優化

用雙重迴圈來控制,當相鄰元素不滿足要求的順序排列 從小到大或從大到小 時,就將兩元素交換位置,以此逐漸遍歷。void bubblesort int array long endtime system.currenttimemillis 列印排序後的前10個數 for int i 0 i 10 i s...

氣泡排序演算法及優化

正常的兩兩交換實現 private static void sort1 int a time system.out.println 跑了 time 次 system.out.println arrays.tostring a 當陣列後面的排好過後就不在執行實現 private static void...