PHP 實現快速排序

導語

這篇瞭解下快速排序。php

快速排序

快速排序(英語:Quicksort),又稱劃分交換排序(partition-exchange sort),簡稱快排,一種排序算法,最先由東尼·霍爾提出。在平均情況下,排序 n 個項目要 O(n log n) 次比較。在最壞情況下則須要 O(n2) 次比較,但這種情況並不常見。事實上,快速排序 O(n log n) 一般明顯比其餘算法更快,由於它的內部循環(inner loop)能夠在大部分的架構上頗有效率地達成。算法

步驟爲:segmentfault

  1. 從數列中挑出一個元素,稱爲"基準"(pivot),
  2. 從新排序數列,全部比基準值小的元素擺放在基準前面,全部比基準值大的元素擺在基準後面(相同的數能夠到任何一邊)。在這個分區結束以後,該基準就處於數列的中間位置。這個稱爲分區(partition)操做。
  3. 遞歸地(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

相關文章
相關標籤/搜索