排序原理:比較兩個相鄰的元素,將值大的元素交換至右端,小的元素向上冒泡,這也是冒泡演算法名稱的由來。
排序流程如下:
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...