快速排序的第一步是在列表中隨機選取乙個基準值,將列表中剩餘的其他數與基準值逐一比較,小於基準值的放在基準值左側,大於基準值的放在基準值右側,這樣就會形成如下的新列表:
接下來對左側小於基準值的列表繼續執行上述過程,直至最後左側排序完成
再對右側大於基準值的列表繼續執行上述過程,直至右側排序完成
將[左側已完成排序列表]
拼接上基準值
再拼接上[右側已完成排序列表]
,即可得到排序完成的列表。從上面的描述可以看出,,由於需要反覆執行快速排序
,所以快速排序需要用遞迴
來實現。。以下是執行流程的示意圖:
附php
實現**:
<?php
function
quicksort
($arrayneedssort
)else
else
}// 先對左側較小的陣列進行排序
$ltres
=quicksort
($ltarr);
// 再對右側較大的陣列進行排序
$gtres
=quicksort
($gtarr);
$res
=array_merge
($ltres,[
$base],
$gtres);
// 可以列印中間值進行觀察
// echo '';
// print_r($res);
return
$res;}
}$array=[
5,9,
3,1,
2,8,
4,7,
6];$res
=quicksort
($array);
echo'';
print_r
($res);
--snip--列印中間值的結果如下--
可以看出來首個數字是5,以5為基準,先對左側較小列表的進行排序,再對右側較大的列表進行排序,最後得到完整的結果
array([
0]=>1[
1]=>2)
array([
0]=>1[
1]=>2[
2]=>3[
3]=>4)
array([
0]=>6[
1]=>7)
array([
0]=>6[
1]=>7[
2]=>8)
array([
0]=>6[
1]=>7[
2]=>8[
3]=>9)
array([
0]=>1[
1]=>2[
2]=>3[
3]=>4[
4]=>5[
5]=>6[
6]=>7[
7]=>8[
8]=>
9)
notice
:許多人會懼怕遞迴呼叫
,其實遞迴呼叫掌握好它的兩個條件:基準條件
和遞迴條件
的話還是比較容易理解的。滿足基準條件
則不再繼續遞迴,開始返回。滿足遞迴條件
則繼續呼叫遞迴往下執行。。
排序演算法之快速排序
快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出...
排序演算法之快速排序
快速排序入口 public void quicksort int lists 遞迴呼叫該函式。原理 每次從陣列從選乙個標兵 本實現為簡單起見直接選取給定範圍內的第乙個元素為標兵 讓後在給定範圍內進行雙向遍歷,目的是以標兵為分界線,將所有小於標兵值的數字排一邊,將所有大於標兵的數字 放到另一邊。標兵移...
排序演算法之快速排序
快速排序是一種不穩定的排序演算法,它的基本思想是,以某個元素為基準,將所有大於等於它的值放在右邊,小於它的值放在左邊,這樣陣列就被分為兩部分,遞迴對這兩部分進行快速排序,而單個元素我們認為是已經排好序的。這是一種歸併思想,當然在最後一步,合併,我們什麼也沒有做也不用做。每一次排序都有乙個元素被放在正...