快速排序和二分查詢時間複雜度詳解

2021-07-11 11:25:11 字數 3445 閱讀 5786

因為二分查詢每次排除掉一半的不適合值,所以對於n個元素的情況:

一次二分剩下:n/2

兩次二分剩下:n/2/2 = n/4

。。。m次二分剩下:n/(2^m)

在最壞情況下是在排除到只剩下最後乙個值之後得到結果,所以為

n/(2^m)=1;

2^m=n;

所以時間複雜度為:log2(n)

快速排序的基本思想是:每次從無序的序列中找出乙個數作為中間點(可以把第乙個數作為中間點),然後把小於中間點的數放在中間點的左邊,把大於中間點的數放在中間點的右邊;對以上過程重複log(n)次得到有序的序列。

快速排序的時間複雜性分析:排序的大體如下圖所示,假設有1到8代表要排序的數,快速排序會遞迴log(8)=3次,每次對n個數進行一次處理,所以他的時間複雜度為n*log(n)。所以排序問題的時間複雜度可以認為是對排序資料的總的操作次數。

哈哈,話說真心有點兒不理解,國外的親們真是有意思,這舞蹈一跳,丫的瞬間就明白了所謂的快速排序。建議國內教授計算機演算法的老師都看一下這個系列的舞蹈,很給力。

話說已經有了充分的分析,以下文章**:

快速排序的時間主要耗費在劃分操作上,對長度為 k 的區間進行劃分,共需 k-1 次關鍵字的比較。

最壞時間複雜度:最壞情況是每次劃分選取的基準都是當前無序區中關鍵字最小(或最大)的記錄,劃分的結果是基準左邊的子區間為空(或右邊的子區間為空),而劃分所得的另乙個非空的子區間中記錄數目,僅僅比劃分前的無序區中記錄個數減少乙個。因此,快速排序必須做 n-1 次劃分,第 i 次劃分開始時區間長度為 n-i-1, 所需的比較次數為 n-i(1<=i<=n-1), 故總的比較次數達到最大值 cmax =n(n-1)/2=o(n^2) 。如果按上面給出的劃分演算法,每次取當前無序區的第 1 個記錄為基準,那麼當檔案的記錄已按遞增序(或遞減序)排列時,每次劃分所取的基準就是當前無序區中關鍵字最小(或最大)的記錄,則快速排序所需的比較次數反而最多。

最好時間複雜度:在最好情況下,每次劃分所取的基準都是當前無序區的「中值」記錄,劃分的結果與基準的左、右兩個無序子區間的長度大致相等。總的關鍵字比較次數為 o(n×lgn)。

用遞迴樹來分析最好情況下的比較次數更簡單。因為每次劃分後左、右子區間長度大致相等,故遞迴樹的高度為 o(lgn),而遞迴樹每一層上各結點所對應的劃分過程中所需要的關鍵字比較次數總和不超過 n,故整個排序過程所需要的關鍵字比較總次數 c(n)=o(n×lgn) 。因為快速排序的記錄移動次數不大於比較的次數,所以快速排序的最壞時間複雜度應為 o(n^2 ),最好時間複雜度為 o(n×lgn)。

基準關鍵字的選取:在當前無序區中選取劃分的基準關鍵字是決定演算法效能的關鍵。 ① 「三者取中」的規則,即在當前區間裡,將該區間首、尾和中間位置上的關鍵字比較,以三者之中值所對應的記錄作為基準,在劃分開始前將該基準記錄和該區的第 1 個記錄進行交換,此後的劃分過程與上面所給的 partition 演算法完全相同。 ② 取位於 low 和 high 之間的隨機數 k(low<=k<=high), 用 r[k] 作為基準;選取基準最好的方法是用乙個隨機函式產生乙個位於 low 和 high 之間的隨機數 k(low<=k<=high), 用 r[k] 作為基準 , 這相當於強迫 r[low..high] 中的記錄是隨機分布的。用此方法所得到的快速排序一般稱為隨機的快速排序。隨機的快速排序與一般的快速排序演算法差別很小。但隨機化後,演算法的效能大大提高了,尤其是對初始有序的檔案,一般不可能導致最壞情況的發生。演算法的隨機化不僅僅適用於快速排序,也適用於其他需要資料隨機分布的演算法。

平均時間複雜度:儘管快速排序的最壞時間為 o(n^2 ), 但就平均效能而言,它是基於關鍵字比較的內部排序演算法中速度最快的,快速排序亦因此而得名。它的平均時間複雜度為 o(n×lgn)。

空間複雜度:快速排序在系統內部需要乙個棧來實現遞迴。若每次劃分較為均勻,則其遞迴樹的高度為 o(lgn), 故遞迴後所需棧空間為 o(lgn) 。最壞情況下,遞迴樹的高度為 o(n), 所需的棧空間為 o(n) 。

穩定性:快速排序是非穩定的。

哈哈,話說真心有點兒不理解,國外的親們真是有意思,這舞蹈一跳,丫的瞬間就明白了所謂的快速排序。建議國內教授計算機演算法的老師都看一下這個系列的舞蹈,很給力。

話說已經有了充分的分析,以下文章**:

快速排序的時間主要耗費在劃分操作上,對長度為k 的區間進行劃分,共需k-1 次關鍵字的比較。

最壞時間複雜度:最壞情況是每次劃分選取的基準都是當前無序區中關鍵字最小(或最大)的記錄,劃分的結果是基準左邊的子區間為空(或右邊的子區間為空),而劃分所得的另乙個非空的子區間中記錄數目,僅僅比劃分前的無序區中記錄個數減少乙個。因此,快速排序必須做n-1 次劃分,第i 次劃分開始時區間長度為n-i-1, 所需的比較次數為n-i(1<=i<=n-1), 故總的比較次數達到最大值cmax =n(n-1)/2=o(n^2) 。如果按上面給出的劃分演算法,每次取當前無序區的第1 個記錄為基準,那麼當檔案的記錄已按遞增序(或遞減序)排列時,每次劃分所取的基準就是當前無序區中關鍵字最小(或最大)的記錄,則快速排序所需的比較次數反而最多。

最好時間複雜度:在最好情況下,每次劃分所取的基準都是當前無序區的「中值」記錄,劃分的結果與基準的左、右兩個無序子區間的長度大致相等。總的關鍵字比較次數為o(n×lgn)。

用遞迴樹來分析最好情況下的比較次數更簡單。因為每次劃分後左、右子區間長度大致相等,故遞迴樹的高度為o(lgn),而遞迴樹每一層上各結點所對應的劃分過程中所需要的關鍵字比較次數總和不超過n,故整個排序過程所需要的關鍵字比較總次數c(n)=o(n×lgn) 。因為快速排序的記錄移動次數不大於比較的次數,所以快速排序的最壞時間複雜度應為o(n^2 ),最好時間複雜度為o(n×lgn)。

基準關鍵字的選取:在當前無序區中選取劃分的基準關鍵字是決定演算法效能的關鍵。 ① 「三者取中」的規則,即在當前區間裡,將該區間首、尾和中間位置上的關鍵字比較,以三者之中值所對應的記錄作為基準,在劃分開始前將該基準記錄和該區的第1 個記錄進行交換,此後的劃分過程與上面所給的partition 演算法完全相同。 ② 取位於low 和high 之間的隨機數k(low<=k<=high), 用r[k] 作為基準;選取基準最好的方法是用乙個隨機函式產生乙個位於low 和high 之間的隨機數k(low<=k<=high), 用r[k] 作為基準, 這相當於強迫r[low..high] 中的記錄是隨機分布的。用此方法所得到的快速排序一般稱為隨機的快速排序。隨機的快速排序與一般的快速排序演算法差別很小。但隨機化後,演算法的效能大大提高了,尤其是對初始有序的檔案,一般不可能導致最壞情況的發生。演算法的隨機化不僅僅適用於快速排序,也適用於其他需要資料隨機分布的演算法。

平均時間複雜度:儘管快速排序的最壞時間為o(n^2 ), 但就平均效能而言,它是基於關鍵字比較的內部排序演算法中速度最快的,快速排序亦因此而得名。它的平均時間複雜度為o(n×lgn)。

空間複雜度:快速排序在系統內部需要乙個棧來實現遞迴。若每次劃分較為均勻,則其遞迴樹的高度為o(lgn), 故遞迴後所需棧空間為o(lgn) 。最壞情況下,遞迴樹的高度為o(n), 所需的棧空間為o(n) 。

穩定性:快速排序是非穩定的。

二分查詢時間複雜度推導

二分查詢是乙個非常常用且簡潔的查詢演算法,相信很多人也知道它的時間複雜度是logn,但是我看網上的大多數部落格給出的所謂推導過程都十分不嚴謹,於是我花了些時間自己寫了推導過程。首先上二分查詢的 public int find int x,int data 查詢元素下標,沒找到返回 1 param x...

二分查詢時間複雜度的計算

時間複雜度無非就是while迴圈的次數!總共有n個元素,漸漸跟下去就是n,n 2,n 4,n 2 k,其中k就是迴圈的次數 由於你n 2 k取整後 1 即令n 2 k 1 可得k log2n,是以2為底,n的對數 所以時間複雜度可以表示o o logn 二分查詢的時間複雜度是o log n 最壞情況...

二分查詢時間複雜度的計算

時間複雜度無非就是while迴圈的次數!總共有n個元素,漸漸跟下去就是n,n 2,n 4,n 2 k,其中k就是迴圈的次數 由於你n 2 k取整後 1 即令n 2 k 1 可得k log2n,是以2為底,n的對數 所以時間複雜度可以表示o o logn 二分查詢的時間複雜度是o log n 最壞情況...