冒泡排序
冒泡排序(英語:Bubble Sort,台灣另外一種譯名為:泡沫排序)是一種簡單的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。
原理
假定有一組數據(亂序),現要將這些數據按從小到大進行排序。
1 從左到右依次比較相鄰的兩個數,將小的數放在左邊,大的數放在右邊,這樣依次比較下來,最大的數在最右方。
2 因為最后一位一定是正確的,所以繼續對除最后一位的數組重復上面的步驟,直到排序完成。
例子
假定有一數組$a=[1,5,6,3,8,4],現需要將它們按從小到大排序
經過步驟一,數組變為$a=[1,5,3,6,4,8],現在保證的數組的最后一位是正確的,接着將數組除了最后一位繼續重復步驟一,直至排序完成。
PHP代碼實現function bubbleSort($myArray){
$length=count($myArray);
for ($i=0; $i
for ($j=0; $j < $length-1-$i; $j++) {
if ($myArray[$j]>$myArray[$j+1]) {
$temp=$myArray[$j];
$myArray[$j]=$myArray[$j+1];
$myArray[$j+1]=$temp;
}
}
}
return $myArray;
}
算法時間復雜度計算
所需關鍵字的比較次數C=n(n-1)/2=O(n2)
所以冒泡排序的時間復雜度為O(n2)
冒泡排序優化思想
對冒泡排序的優化主要是減少交換次數。如果一次掃描中元素沒有發生交換,那么排序就可以結束了。為此可設置一標志量flag,默認為false,如果掃描中發生交換了則把flag置為true,下輪掃描前先檢查這個變量,如果flag=false則排序結束。
更進一步,可以記錄每次掃描中最后一次交換的位置,下次掃描的時候只要掃描到上次的最后交換位置就行了,因為后面的都是已經排好序的,無需再比較。
冒泡排序優化PHP代碼實現function bubbleSort($myArray){
$length=count($myArray);
for ($i=0; $i
$flag=false;
for ($j=0; $j < $length-1-$i; $j++) {
if ($myArray[$j]>$myArray[$j+1]) {
$temp=$myArray[$j];
$myArray[$j]=$myArray[$j+1];
$myArray[$j+1]=$temp;
$flag=true;
}
}
if(!$flag){
return $myArray;
}
}
return $myArray;
}