這篇瞭解下快速排序。php
快速排序(英語:Quicksort),又稱劃分交換排序(partition-exchange sort),簡稱快排,一種排序算法,最先由東尼·霍爾提出。在平均情況下,排序 n 個項目要 O(n log n) 次比較。在最壞情況下則須要 O(n2) 次比較,但這種情況並不常見。事實上,快速排序 O(n log n) 一般明顯比其餘算法更快,由於它的內部循環(inner loop)能夠在大部分的架構上頗有效率地達成。算法
步驟爲:segmentfault
- 從數列中挑出一個元素,稱爲"基準"(pivot),
- 從新排序數列,全部比基準值小的元素擺放在基準前面,全部比基準值大的元素擺在基準後面(相同的數能夠到任何一邊)。在這個分區結束以後,該基準就處於數列的中間位置。這個稱爲分區(partition)操做。
- 遞歸地(recursively)把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞歸到最底部時,數列的大小是零或一,也就是已經排序好了。這個算法必定會結束,由於在每次的迭代(iteration)中,它至少會把一個元素擺到它最後的位置去。架構
維基百科中的介紹。核心的思想是使用遞歸,下面的動圖很形象。oop
<?php $arr = [33, 24, 8, 21, 2, 23, 3, 32, 16]; function quickSort($arr) { $count = count($arr); if ($count < 2) { return $arr; } $leftArray = $rightArray = array(); $middle = $arr[0];// 基準值 for ($i = 1; $i < $count; $i++) { // 小於基準值,存入左邊;大於基準值,存入右邊 if ($arr[$i] < $middle) { $leftArray[] = $arr[$i]; } else { $rightArray[] = $arr[$i]; } } $leftArray = quickSort($leftArray); $rightArray = quickSort($rightArray); return array_merge($leftArray, array($middle), $rightArray); // 倒序 // return array_merge($rightArray, array($middle), $leftArray); } print_r(quickSort($arr)); // Array ( [0] => 2 [1] => 3 [2] => 8 [3] => 16 [4] => 21 [5] => 23 [6] => 24 [7] => 32 [8] => 33 )
參考資料:快速排序、PHP 快速排序算法、GIF演示排序算法。ui