PHP排序算法系列:快速排序

快速排序

快速排序(Quicksort)是對冒泡排序的一種改進。
快速排序由C.A.R.Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

原理

快速排序採用的思想是分治思想。

快速排序是找出一個元素(理論上可以隨便找一個)作爲基準(pivot),然後對數組進行分區操作,使基準左邊元素的值都不大於基準值,基準右邊的元素值都不小於基準值,如此作爲基準的元素調整到排序後的正確位置。遞歸快速排序,將其他n-1個元素也調整到排序後的正確位置。最後每個元素都是在排序後的正確位置,排序完成。所以快速排序算法的核心算法是分區操作,即如何調整基準的位置以及調整返回基準的最終位置以便分治遞歸。

實現方法

(1)在數據集之中,選擇一個元素作爲”基準”(pivot)。
(2)所有小於”基準”的元素,都移到”基準”的左邊;所有大於”基準”的元素,都移到”基準”的右邊。
(3)對”基準”左邊和右邊的兩個子集,不斷重複第一步和第二步,直到所有子集只剩下一個元素爲止。

舉例

對數組[53,89,12,98,25,37,92,5]進行排序

1.選擇第一個元素53作爲基準。

==53==,89,12,98,25,37,92,5

2.從左到右,將每個元素與”基準”進行比較,形成兩個子集。

12,25,37,5,==53==,89,98,92

3.對兩個子集重複1,2操作,直到所有子集元素只剩下一個元素爲止。

(5,==12==,25,37),53,(==89==,98,92)

5,12,(25,37),53,89,(98,92)

5,12,25,37,53,89,92,98

PHP代碼實現

function quick_sort($arr){
    $length=count($arr);
    if($length<=1){
        return $arr;
    }
    $left=$right=array();
    //將$arr[0]作爲基準值
    $pivot=$arr[0];
    for ($i=1; $i <$length ; $i++) {
        if($arr[$i]<$pivot){
            $left[]=$arr[$i];
        }else{
            $right[]=$arr[$i];
        }
    }
    return array_merge(quick_sort($left),(array)$pivot,quick_sort($right));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章