【算法设计与分析】16 分治策略:快速排序(快速排序的时间复杂度计算)
上一篇文章學(xué)習(xí)了:【算法設(shè)計(jì)與分析】15 分治策略:芯片測(cè)試
文章目錄
- 1. 快速排序的基本思想
- 1.2 時(shí)間復(fù)雜度的計(jì)算
- 1.21 最壞情況時(shí)間復(fù)雜度計(jì)算
- 1.22 最好情況時(shí)間復(fù)雜度
- 1.23 平均時(shí)間復(fù)雜度計(jì)算
- 2 總結(jié)
1. 快速排序的基本思想
- 用首元素 x 作劃分標(biāo)準(zhǔn),將輸入數(shù) 組 A劃分成不超過(guò) x 的元素構(gòu)成的數(shù) 組 AL,大于 x 的元素構(gòu)成的數(shù)組 AR. 其中 AL, AR從左到右存放在數(shù)組 A 的位置.
- 遞歸地對(duì)子問(wèn)題 AL和 AR 進(jìn)行排序, 直到子問(wèn)題規(guī)模為 1 時(shí)停止.
下面兩張圖是它的偽代碼表示:
劃分的過(guò)程為:
以下是劃分的例子:
1.2 時(shí)間復(fù)雜度的計(jì)算
1.21 最壞情況時(shí)間復(fù)雜度計(jì)算
最壞情況:
- W(n) = W(n-1)+n-1
- W(1) = 0
得出:
- W(n) = n(n-1)/2
在最壞情況下,有一種可能為:每次劃分,首元素依然是在首元素,它是最小的(或者是最大的),下次劃分也是同樣的結(jié)果。這種情況下,是最壞的情況。子問(wèn)題永遠(yuǎn)比上一個(gè)原問(wèn)題只少了一個(gè)元素。并且每次都需要對(duì)n-1個(gè)元素進(jìn)行遍歷比較。
由上面的結(jié)果看出最壞的情況的時(shí)間復(fù)雜度是O(n2)
1.22 最好情況時(shí)間復(fù)雜度
最好情況下,就是每一次劃分,AL 與AR 總是均衡的在兩邊,首元素最終落到中間。那么子問(wèn)題就變成了原問(wèn)題的一半的元素?cái)?shù)量(但是有兩個(gè)子問(wèn)題)。
- T(n) = 2 T(n/2)+n-1
- T(1) = 0
得出:
T(n)=Θ(nlogn)T(n) = \Theta (nlogn)T(n)=Θ(nlogn)
以上兩種時(shí)間復(fù)雜度是最好和最壞的情況下。那么均衡額時(shí)間復(fù)雜度如何計(jì)算呢?
在計(jì)算均衡時(shí)間復(fù)雜度之前先來(lái)看看劃分之后AL 與 AR 的比例是固定時(shí)的時(shí)間復(fù)雜度是多少?
例如子問(wèn)題的規(guī)模比是1:9時(shí),那么有:
- T(n) = T(n/10) + T(9n/10) + n
- T(1) = 0
根據(jù)遞歸樹(shù),時(shí)間復(fù)雜度為:
- T(n)=Θ(nlogn)T(n) = \Theta (nlog n)T(n)=Θ(nlogn)
注釋,上面的遞歸樹(shù)計(jì)算如下:
1.23 平均時(shí)間復(fù)雜度計(jì)算
那么平均時(shí)間復(fù)雜度計(jì)算如下:
首元素最后落在的位置,可能在1,2,3…n
假設(shè)情況的概率均為1/n,那么各個(gè)情況下,子問(wèn)題的計(jì)算規(guī)模如下:
- 首元素在位置 1: T(0), T(n-1)
- 首元素在位置 2: T(1), T(n-2)
…
- 首元素在位置 n-1: T(n-2), T(1)
- 首元素在位置 n: T(n-1), T(0)
那么子問(wèn)題的工作量一共為:2[T(1)+T(2)+…+T(n-1)]
劃分工作量 n-1
那么平均情況下時(shí)間復(fù)雜度計(jì)算公式為:
首元素劃分后每個(gè)位置概率相等
2 總結(jié)
快速排序一般人都能寫(xiě)出來(lái),但是要理解它的時(shí)間復(fù)雜度計(jì)算,恐怕并不是一般人都會(huì)計(jì)算,我們要追根問(wèn)底。
快速排序算法
? 分治策略
? 子問(wèn)題劃分是由首元素決定 ? 最壞情況下時(shí)間O(n2)
? 平均情況下時(shí)間為O(nlogn)
總結(jié)
以上是生活随笔為你收集整理的【算法设计与分析】16 分治策略:快速排序(快速排序的时间复杂度计算)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: max31865C语言程序,max318
- 下一篇: java简历项目经验大全,不吃透都对不起