其實也就是點看演算法導論的心得,感覺演算法導論寫的有點不詳細的補充
快速排序 我的理解就是利用分治法 ,遞迴排序最後合併的排序,因為快速排序的最壞時間複雜度比較低所以快速被叫做快速排序如圖
對於求快速排序的時間複雜度可以用遞迴樹來做如圖
遞迴式如下
簡化後對於快速排序用二分法如下
n代表規模如陣列有16個數那麼n就代表16 cn代表n次的分開陣列,再合併陣列所用的時間因為是一重迴圈所以用cn代替 .
下面我們用遞迴樹求時間複雜度(還有很多方法這只是其中一種如圖)
cn這個圖比較難理解。下面來說一下意思
t(n)=2t(n/2)+cn 這裡的常數是cn也就意味著遞迴到這裡要加的數是cn 比如n為16的時候 cn 就是 16c 遞迴第一次就要2t(n/2)+16c 也就是說16c也就是cn是t(n)的一部分 那麼可能有人要說了2t(n/2) 哪去了。。答案是2t(n/2)迭代遞迴了,遞迴的時候每次都加上乙個常數 8c,4c,2c 遞迴到最後 也就是t(1)=c 而很明顯這種遞迴這種常數就如 這樹一樣發展,從而形成了該遞迴樹。而這遞迴樹所有節點的和就是該遞迴式的時間複雜度
理解了這一層就好說了 因為每次都是二分和都是父節點所以每一層和總的節點和都是cn
然後求出樹的深度就行了。比如就n=1那麼就一層 n= 2 就2層 n=4就三層 。 很顯然2的樹的深度次方 減去 1就是 n的值 既 樹的深度 k = log2n + 1
既時間複雜度是每層的節點和 cn*k=cn*(log2n+1) = cnlog2n+n 忽略低階項既 o(nlog2n)
簡寫為o(nlgn)
快速排序時間複雜度分析
為了分析快速排序的時間複雜度,請先看下面的主定理 主定理 t n at n b f n 其中 a 1 and b 1 是常量 並且 f n 是乙個漸近正函式,為了使用這個主定理,您需要考慮下列三種情況 快速排序的每一次劃分把乙個 問題分解成兩個子問題,其中的關係可以用下式表示 t n 2t n 2 ...
排序時間複雜度 快速排序 改進快排的方法
三種改進方案 改進方案 改進選取樞軸的方法 1 選取隨機數作為樞軸。但是隨機數的生成本身是一種代價,根本減少不了演算法其餘部分的平均執行時間。2 使用左端,右端和中心的中值做為樞軸元。經驗得知,選取左端,右端,中心元素的中值會減少了快排大約 14 的比較。3 每次選取資料集中的中位數做樞軸。選取中位...
基於比較的快速排序 時間複雜度為O nlogn
快速排序 快排利用的是分治思想。如果要排序陣列中下標從 p 到 r 之間的一組資料,選擇p 到 r 之間的任意乙個資料作為分割槽點pivot。遍歷 p 到 r 之間的資料,將小於pivot的放到左邊,將大於pivot的放到右邊,將pivot放到中間。經過這一步驟後陣列 p 到 r 之間的資料就被分為...