快速排序
快速排序(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));
}