快速排序基本問題

2021-06-16 08:35:17 字數 1931 閱讀 8305

快速排序是分治策略的乙個應用。

演算法思想就是基準元素的劃分,這點可以參考書上的分析。

主要給出快速排序演算法的分析:

快速排序演算法的時間主要耗費在劃分操作上,並與劃分是否平衡密切相關。對於長度為n的待排序序列,一次劃分演算法partition需要堆整個待排序序列掃瞄一遍,其所需要的計算時間顯然為o(n)。

下面從三種情況來討論一下快速排序演算法的時間複雜度。

(1)最壞時間複雜度

最壞情況是每次劃分選取的基準元素都是在當前待排序序列中的最小(或最大)元素,劃分的結果所基準元素左邊的子串行為空(或右邊的子串行為空),而劃分所得的另乙個非空的子串行中元素個數僅僅比劃分前的排序序列中元素個數少1個。

在這樣的情況下,快速排序演算法必須做n-1次劃分,那麼演算法的執行時間t(n)的遞迴形式為:

o(1)                                         n = 1

t(n) =

t(n-1) + o(n)                   n > 1

因此,快速排序演算法的最壞時間複雜度為o(n*(n+1)/2)=o(n*n)

(2)最好時間複雜度

在最好情況下,每次劃分所去的基準元素都是當前待排序序列的「中間值」,劃分的結果所基準元素的左右兩個子串行的長度大致相同,此時,演算法的執行時間t(n)的遞迴形式為:

o(1)                                         n = 1

t(n) =

2 t(n/2) + o(n)                   n > 1

解出後得到最好時間複雜度為o(nlogn).

(3)平均時間複雜度

在平均情況下,採用歸納法可求得t(n)的數量級也為o(nlogn).

儘管快速排序的最壞時間複雜度為n*n,但是就平均效能來說,它是基於元素比較的內部排序演算法中速度最快的,因此得名:quick_sort

快速排序的空間複雜度

因為快速排序採用遞迴執行,所以需要乙個棧來存放每一層遞迴呼叫的必要資訊,其最大容量與遞迴呼叫的深度一致。最好情況下,若每次劃分都比較均勻,則遞迴樹的高度為o(logn),故遞迴需要棧空間為o(logn)。最壞情況下,遞迴樹的高度為o(n),所需要的棧空間為o(n)。平均情況下,所需要的棧空間為o(logn)。

快速排序也有乙個有趣的副產品:快速選擇給出的一些數中第k小的數。一種簡單的方法是使用上述任一種o(nlogn)的演算法對這些數進行排序並返回排序後陣列的第k個元素。快速選擇(quick select)演算法可以在平均o(n)的時間完成這一操作。它的最壞情況同快速排序一樣,也是o(n^2)。在每一次分割後,我們都可以知道比關鍵字小的數有多少個,從而確定了關鍵字在所有數中是第幾小的。我們假設關鍵字是第m小。如果k=m,那麼我們就找到了答案——第k小元素即該關鍵字。否則,我們遞迴地計算左邊或者右邊:當km時,我們遞迴地尋找右邊的元素中第k-m小的數。由於我們不考慮所有的數的順序,只需要遞迴其中的一邊,因此複雜度大大降低。

給出測試**:

[cpp]view plain

copy

print?

#include

#include

#include

#include

#include

#include

using

namespace std;  

#define n 10

int arr[n];  

void print() //列印路徑

int partition(int low, int high) //分解

return j;  

}  void quick_sort(int low, int high)  

}  int select_kthnum(int k, int low, int high) //第k大元素

int main()    

mysql 的基本問題 MySQL 基本問題整理

整理 mysql 安裝部署運維問題解決優化記錄。1 安裝 系統為 centos7 1 rpm 包方式安裝yum install wget wget wget 解壓到某個路徑,安裝全部的 rpm 包yum install mysql rpm 2 yum 庫方式安裝 可參考官網切換版本 rpm ivh ...

C 基本問題

一 編譯為程式集 編譯c 源 檔案將得到程式集檔案,例如 乙個程式集檔案包含 4部分 pe表頭 clr表頭 元資料和 il pe表頭是 windows 作業系統要求的標準資訊 clr表頭專門用於那些需要 clr才能執行的模組 元資料實際上就是一塊二進位制資料,其中包含著一些表,我們可以將元資料表劃分...

DVB DVB基本問題

1 在進行節目搜尋時,nit搜尋,手動搜尋以及全頻段搜尋都要用到那些表,什麼順序?答 先收nit,找到頻點列表,依次搜每乙個頻點。如果是全頻段搜尋,自己建乙個頻點列表開始搜。在乙個頻點上,先收pat,然後收pmt,就可以把節目搜出來了,再搜sdt找到頻道名稱.2 為什麼不先搜尋sdt在搜尋pat p...