冒泡排序是很是容易理解和實現,,以從小到大排序舉例:
設數組長度爲N。
1.比較相鄰的先後二個數據,若是前面數據大於後面的數據,就將二個數據交換。
2.這樣對數組的第0個數據到N-1個數據進行一次遍歷後,最大的一個數據就「沉」到數組第N-1個位置。
3.N=N-1,若是N不爲0就重複前面二步,不然排序完成。數組
方案一:spa
1 function bubble1_sort($array){ 2 $count=count($array); 3 if($count<=1){ 4 return $array; 5 } 6 for($i=0;$i<$count;$i++){ 7 for($j=0;$j<$count;$j++){ 8 if($array[$i]<$array[$j]){ 9 $temp=$array[$i]; 10 $array[$i]=$array[$j]; 11 $array[$j]=$temp; 12 } 13 } 14 } 15 return $array; 16 }
方案二:code
1 function bubble2_sort($array){ 2 $count=count($array); 3 if($count<=1){ 4 return $array; 5 } 6 7 for($i=0;$i<$count;$i++){ 8 for($j=1;$j<$count-$i;$j++){ 9 if($array[$j-1]>$array[$j]){ 10 $temp=$array[$j-1]; 11 $array[$j-1]=$array[$j]; 12 $array[$j]=$temp; 13 } 14 } 15 } 16 return $array; 17 }
方案三:blog
設置一個標誌,若是這一趟發生了交換,則爲true,不然爲false。明顯若是有一趟沒有發生交換,說明排序已經完成。排序
1 function bubble3_sort($array){ 2 $count=count($array); 3 if($count<=1){ 4 return $array; 5 } 6 $flag=true; 7 $j=$count; 8 while($flag){ 9 $flag=false; 10 for($i=1;$i<$j;$i++){ 11 if($array[$i-1]>$array[$i]){ 12 $temp=$array[$i-1]; 13 $array[$i-1]=$array[$i]; 14 $array[$i]=$temp; 15 $flag=true; 16 } 17 } 18 $j--; 19 20 } 21 return $array; 22 23 }
方案四:io
若是有100個數的數組,僅前面10個無序,後面90個都已排好序且都大於前面10個數字,那麼在第一趟遍歷後,最後發生交換的位置一定小於10,且這個位置以後的數據一定已經有序了,記錄下這位置,第二次只要從數組頭部遍歷到這個位置就能夠了。function
function bubble4_sort($array){ $count=count($array); if($count<=1){ return $array; } $flag=$count; while($flag>0){ $k=$flag; $flag=0; for($j=1;$j<$k;$j++){ if($array[$j-1]>$array[$j]){ $temp=$array[$j-1]; $array[$j-1]=$array[$j]; $array[$j]=$temp; $flag=$j; } } } return $array; }
方案五:class
function bubble_sort($array){ $count=count($array); if($count<=1){ return $array; } for($i=$count-1;$i>0;$i--){ $flag=false; for($j=0;$j<$count;$j++){ if($array[$j]>$array[$j+1]){ $temp=$array[$j]; $array[$j]=$array[$j+1]; $array[$j+1]=$temp; $flag=true; } } if(!$flag) break; } return $array; }