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;
}
發佈了48 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章