下列動圖來自@五分鐘學算法,演示了快速排序算法的原理和步驟。php
步驟: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...