PHP 算法 —— 快速排序

算法原理

下列動圖來自@五分鐘學算法,演示了快速排序算法的原理和步驟。php

quick

步驟:html

  • 從數組中選個基準值
  • 將數組中大於基準值的放同一邊、小於基準值的放另外一邊,基準值位於中間位置
  • 遞歸的對分列兩邊的數組再排序

代碼實現

function quickSort($arr)
{
    $len = count($arr);
    if ($len <= 1) {
        return $arr;
    }

    $v = $arr[0];
    $low = $up = array();
    for ($i = 1; $i < $len; ++$i) {
        if ($arr[$i] > $v) {
            $up[] = $arr[$i];
        } else {
            $low[] = $arr[$i];
        }
    }
    $low = quickSort($low);
    $up = quickSort($up);

    return array_merge($low, array($v), $up);
}

測試代碼:算法

$startTime = microtime(1);

$arr = range(1, 10);
shuffle($arr);

echo "before sort: ", implode(', ', $arr), "\n";
$sortArr = quickSort($arr);
echo "after sort: ", implode(', ', $sortArr), "\n";

echo "use time: ", microtime(1) - $startTime, "s\n";

測試結果:segmentfault

before sort: 1, 7, 10, 9, 6, 3, 2, 5, 4, 8
after sort: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
use time: 0.0009009838104248s

時間複雜度

快速排序的時間複雜度在最壞狀況下是O(N2),平均的時間複雜度是O(N*lgN)數組

這句話很好理解:假設被排序的數列中有N個數。遍歷一次的時間複雜度是O(N),須要遍歷多少次呢?至少lg(N+1)次,最多N次。post

1) 爲何最少是lg(N+1)次?快速排序是採用的分治法進行遍歷的,咱們將它看做一棵二叉樹,它須要遍歷的次數就是二叉樹的深度,而根據徹底二叉樹的定義,它的深度至少是lg(N+1)。所以,快速排序的遍歷次數最少是lg(N+1)次。測試

2) 爲何最可能是N次?這個應該很是簡單,仍是將快速排序看做一棵二叉樹,它的深度最大是N。所以,快讀排序的遍歷次數最可能是N次。動畫

參考資料


感謝您的閱讀,以爲內容不錯,點個贊吧 😆ui

原文地址: https://shockerli.net/post/qu...
相關文章
相關標籤/搜索