1. 程式人生 > >從零開始學演算法(一)氣泡排序

從零開始學演算法(一)氣泡排序

從零開始學演算法(一)氣泡排序

氣泡排序

因為在學前端,程式碼是Javascript語言寫的

演算法介紹

氣泡排序(Bubble Sort),是一種電腦科學領域的較簡單的排序演算法。

通過迴圈遍歷元素列來比較兩個相鄰的元素,然後交換大小順序錯誤的兩個元素的位置,直到不需要交換元素,也表明排序完成。

因為在排序的過程中大的元素會慢慢被換到最後像氣泡浮到水面所以稱為“氣泡排序”。

演算法原理

比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。(每一輪會把最大的放到最後一位)。

針對所有的元素重複以上的步驟,除了最後一個。

持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

演算法簡單記憶說明

3,5,9,6,2,1
0,1,2,3,4,5 (位置)
第一遍:(0~n-1)
3<5不交換
5<9不交換
9>6交換:3,5,6,9,2,1
9>2交換:3,5,6,2,9,1
9>1交換:3,5,6,2,1,9
第一遍把最大的數9換到最後一位

第二遍:(0~n-2)
3<5不交換
5<6不交換
6>2交換:3,5,2,6,1,9
6>1交換:3,5,2,1,6,9
第二遍把最大的數6換到n-2的位置上(即該組數的最後一位)

第三遍:(0~n-3)
以此類推

最終排好序:1,2,3,5,6,9

演算法複雜度和穩定性

氣泡排序的時間複雜度是O(N2

假設被排序的數列中有N個數。遍歷一趟的時間複雜度是O(N),需要遍歷N-1次。所以時間複雜度是O(N2

氣泡排序是穩定排序演算法

演算法穩定性的定義: 假設在數列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;並且排序之後,a[i]仍然在a[j]前面。則這個排序演算法是穩定的。

如何理解?舉個例子:
2,1,3,(2),5,4,((2)),6
第一遍:1,2,(2),3,4,((2)),5,6
第二遍:1,2,(2),3,((2)),4,5,6
第三遍:1,2,(2),((2)),3,4,5,6
排序前三個2的順序和排序後三個2的順序相同

程式碼實現

var Bubblearr = [1,5,7,3,6,4,8,13,2];
function BubbleSort(arr){
   if(arr == null || arr.length<2){return;}
   for(var end=arr.length-1;end>0;end--){
   	for(var i=0;i<end;i++){
   		if(arr[i]>arr[i+1]){
   			swap(arr,i,i+1);
   		}
   	}
   }
   return arr;
}

function swap(arr,i,j){
	arr[i] = arr[i]^arr[j];
	arr[j] = arr[i]^arr[j];
	arr[i] = arr[i]^arr[j];
}

BubbleSort(Bubblearr);
console.log(Bubblearr);

輸出結果:1,2,3,4,5,6,7,8,13