PHP四種基礎排序算法--冒泡,直接插入,快速和選擇排序
冒泡排序:重複的走訪要排序的數列,一次比較2個元素,如果他們的順序錯誤則交換過來,這樣重複進行到沒有需要再交換。該排序方法名稱的由來指小(或者大的)的元素會經由交換慢慢的浮到數列的前端。
function maopao(&$array)
{
$temp=array();
//第一層循環,控制需要冒泡的輪數
for($i=1,$len=count($array);$i<$len;$i++){
//第二層循環,控制冒出一個數需要經歷的輪數
for($j=0;$j<$len-$i;$j++){
if($array[$j]>$array[$j+1]){
$temp=$array[$j+1];
$array[$j+1]=$array[$j];
$array[$j]=$tmp;
}
}
}
return $array;
}
直接插入排序:每次從無序列表中取出第一個元素,把他插入到有序列表的合適位置,使表仍然有序
算法實現:第一趟比較前兩個數,然後把第二個數按大小插入到有序表中; 第二趟把第三個數據與前兩個數從後向前掃描,把第三個數按大小插入到有序表中;依次進行下去,進行了(n-1)趟掃描以後就完成了整個排序過程。
直接插入排序是由兩層嵌套循環組成的。外層循環標識並決定待比較的數值。內層循環爲待比較數值確定其最終位置。直接插入排序是將待比較的數值與它的前一個數值進行比較,所以外層循環是從第二個數值開始的。當前一數值比待比較數值大的情況下繼續循環比較,直到找到比待比較數值小的並將待比較數值置入其後一位置,結束該次循環。
function insertSort(&$array)
{
$tmp=array();
//雙重循環,外層控制輪數,內層控制比較次數
//從第二個數值開始
for($i=1,$len=count($array);$i<$len;$i++){
$temp=$array[$i]; //設置哨兵(待比較數),假設該數前面的數都已經完成排序。
//當前一位數值大於待比較數時,繼續循環
for($j=$i-1;$j>=0 & $array[$j]>$temp;$j--){
$array[$j+1]=$array[$j]; //將比較後的數值往後挪一位
}
$array[$j+1]=$temp; //當找到比待比較數小的數值時,在該數值後面以爲插入待比較數
}
return $array;
}
插入排序和冒泡排序很類似,但是冒泡排序是比較2個相鄰的數值的大小,通過2個數不斷的比較而達到排序的目的,而直接插入排序是從後往前比較第n+1個數在前n個已經排序的數中的位置,並插入其中。二者的時間複雜度都是O(n^2).
快速排序:選擇當前數組中任意一個元素(一般爲第一個元素)作爲標準,將後面的元素與標準元素比較,比標準元素小的放入一個數組,否則放入另一個數組,然後再對這兩個數組進行同樣的操作,該排序方法一般使用遞歸實現
function FastSort($arr){
//判斷遞歸是否該需要進行
if(count($arr) <= 1) {
return $arr;
}
$base_num=$arr[0]; //選取第一個元素作爲標準元素
$left_arr=array(); //比標準元素小的元素裝入這個數組
$right_arr=array(); //比標準元素大的元素裝入該數組
for($i=1;$i<count($arr);$i++){
if($arr[$i]<$base_num){
$left_arr[]=$arr[$i];
}else{
$right_arr[]=$arr[$i];
}
}
$left_arr=FastSort($left_arr);
$right_arr=FastSort($right_arr);
return array_merge($left_arr,array($base_num),$right_arr);
}
選擇排序:在要排序的一組數中,選出最小的一個數與第一個位置的數交換。然後在剩下的數當中再找最小的與第二個位置的數交換,如此循環到倒數第二個數和最後一個數比較爲止。
function selectSort($arr) {
//雙重循環完成,外層控制輪數,內層控制比較次數
$len=count($arr);
for($i=0; $i<$len-1; $i++) {
//先假設最小的值的位置
$p = $i;
for($j=$i+1; $j<$len; $j++) {
//$arr[$p] 是當前已知的最小值
if($arr[$p] > $arr[$j]) {
//比較,發現更小的,記錄下最小值的位置;並且在下次比較時採用已知的最小值進行比較。
$p = $j;
}
}
//已經確定了當前的最小值的位置,保存到$p中。如果發現最小值的位置與當前假設的位置$i不同,則位置互換即可。
if($p != $i) {
$tmp = $arr[$p];
$arr[$p] = $arr[$i];
$arr[$i] = $tmp;
}
}
//返回最終結果
return $arr;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.