快速排序:顧名思義,這是實踐中的一種快速的排序演算法,它平均執行實踐是o(n log n).該演算法之所以特別快,主要是由於非常精煉和高度優化的內部迴圈。它的最壞情形效能為o(n^2)。
像歸併排序一樣,快速排序也是一種分治的遞迴演算法。
步驟:1、從數列中挑出乙個元素,稱為"基準"(pivot)
2、重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(相同的數可以到任何一邊)。在這個分割槽結束之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。
3、遞迴地把小於基準值元素的子數列和大於基準值元素的子數列排序。
下面我寫了兩種實現方法:
1、基於臨時陣列
每次遞迴都會建立兩個臨時陣列用於存放比基準值大和比基準值小的元素,沒有涉及到元素交換
2、基於元素交換
方法一:
1/**2* @param $arr 要排序的陣列
3* @return array 排好序的陣列4*/
5function quick_sort($arr)6
11//
建立臨時陣列,以基準值為分界線,大於基準值的放在右側,小魚基準值的放在左側
12$leftarr = $rightarr = array
();13
//基準值,一般取陣列第乙個元素
14$middle = $arr[0];
15//
迴圈陣列與基準值比較
16for ($i = 1; $i
< $count; $i++) else22}
23//
遞迴,將左右陣列排序
24$leftarr = quick_sort($leftarr
);25
$rightarr = quick_sort($rightarr
);26
27//
將排好序的臨時陣列合併
28return
array_merge($leftarr, array($middle), $rightarr
);29
30 }
方法二:
1/**2* @param $arr 要排序的陣列
3* @return array 排好序的陣列4*/
5function quicksort($arr)6
1112
$i = 0;
13$j = $count - 1;
14//
基準值15
$key = $arr[0];
16while ($i
< $j
) 21
//交換
22$arr[$i] = $arr[$j
];23
$arr[$j] = $key;24
//再從前往後比較,比基準值小的放過,比基準值大的做交換
25while ($i
< $j && $arr[$i] <= $key
) 28
$arr[$j] = $arr[$i
];29
$arr[$i] = $key;30
31}32//
經過一輪交換,基準值左側全部比基準值小,基準值右側全部比基準值大,但左右兩側並不一定是排好序的
33//然後進行遞迴,將基準值左右兩側進行排序
34if ($i == 0) else
3940
if ($i == $count - 1) else
45//
將排好序的陣列進行合併返回
46return
array_merge($l, array($key), $r
);47 }
測試:
1$arr = [1, 0, 8, 3, 4, -2, -6, 7, -10];
2$sortarr = quick_sort($arr);3
print_r($sortarr);4
echo '';5
$sortarr1 = quicksort($arr);6
print_r($sortarr1);
輸出分別為:array ( [0] => -10 [1] => -6 [2] => -2 [3] => 0 [4] => 1 [5] => 3 [6] => 4 [7] => 7 [8] => 8 )
array ( [0] => -10 [1] => -6 [2] => -2 [3] => 0 [4] => 1 [5] => 3 [6] => 4 [7] => 7 [8] => 8 )
php 快速排序演算法,PHP 快速排序演算法
概念 快速排序演算法是對冒泡演算法的乙個優化。他的思想是先對陣列進行分割,把大的元素數值放到乙個臨時陣列裡,把小的元素數值放到另乙個臨時陣列裡 這個分割的點可以是陣列中的任意乙個元素值,一般用第乙個元素,即 array 0 然後繼續把這兩個臨時陣列重複上面拆分,最後把小的陣列元素和大的陣列元素合併起...
php 快速排序演算法,php 快速排序函式
在php程式設計中會用到一些常用的演算法,把這些演算法 寫成函式方便以後呼叫 php快速排序函式就這樣誕生了,兩個版本,遞迴和無遞迴。可以根據實際需要選用。qsort 資料快速排序遞迴版 array to sort 需要排序的陣列 排序過程中,陣列的鍵會被替換為數字索引的鍵 如果 array to ...
快速排序 php
快速排序 function quick sort arr 如果沒有返回,說明陣列內的元素個數 多餘1個,需要排序 選擇乙個標尺 選擇第乙個元素 base num arr 0 遍歷 除了標尺外的所有元素,按照大小關係放入兩個陣列內 初始化兩個陣列 left array array 小於標尺的 righ...