排序演算法及演算法複雜度

2021-06-16 15:34:34 字數 2515 閱讀 3122

【演算法】

演算法是指令的有限集合,順序執行這些指令,可以完成特定的任務。演算法具有以下特性:

1)  輸入:從外界獲取零個或多個量

2)  輸出:產生至少乙個量

3)  確定性:每條指令清晰、無二義性

4)  有限性:演算法對所有情形都能在執行有限步之後結束

5)  有效性:每條指令都是可執行的

【選擇排序】

工作原理:在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排列完畢。

形象描述:對著一群資料說,你們誰最小出列,站到最前面,然後繼續對剩餘的無序資料說,你們誰最小出列,站到最前面。

【氣泡排序】

工作原理:重複地走訪要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是走訪n-1次。

【快速排序】

快速排序使用分治法策略來把乙個序列分為兩個子串。步驟為:

1)  從數列中挑出乙個元素,稱為「基準」;

2)  重新排列資料,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺放在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽操作。

3)  遞迴地把小於基準值元素的子數列和大於基準值元素的子數列排序。

【插入排序】

演算法描述如下:

1)  從第乙個元素開始,該元素可以認為已經被排序

2)  取出下乙個元素,在已經排序的元素中從後向前掃瞄

3)  如果該元素大於新元素,將該元素移到下一位置

4)  重複步驟3,直到找到已排序的元素小於或者等於新元素的位置

5)  將新元素插入到該位置後

6)  重複步驟2~5。

【堆排序】

這裡堆,指得不是堆疊的那個堆,而是一種資料結構。

堆可以視為一棵完全的二叉數,完全二叉樹的乙個「優秀」性質是,除了最底層之外,每一層都是滿的,這使得堆可以利用陣列來表示,每乙個結點對應陣列中的乙個元素。

陣列與堆之間的關係:

二叉堆一般分為兩種:最大堆和最小堆,最大堆的特點是:每個父節點的元素都不小於其孩子節點(如果存在)的元素值,因此,最大堆的最大元素出現在根節點(堆頂)。堆排序主要進行三種操作:

1)  最大堆調整(max_heapify):將堆的末端子節點作調整,使得子節點永遠小於父節點;

2)  建立最大堆(build_max_heap):將堆所有資料重新排序;

3)  堆排序(sortheap):移除位在第乙個資料的根節點,並做最大堆調整的遞迴運算;

【時間複雜度】

乙個演算法花費的時間與演算法中語句的執行次數成正比,哪個演算法中語句執行次數多,它花費時間就多。乙個演算法中的語句執行次數稱為語句頻度或時間頻度t(n)。n稱為問題的規模,當n不斷變化時,時間頻度也會不斷變化,有時我們想知道它變化時呈現什麼規律,為此引入時間複雜度的概念。一般,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t(n)表示若有某個輔助函式f(n),使得當n趨近於無窮大時,t(n)/f(n)的極限值為不等於零的常數,則稱f(n)是t(n)的同數量級函式。記作t(n)=o(f(n)),稱o(f(n)) 為演算法的漸進時間複雜度,簡稱時間複雜度。 在各種不同演算法中,若演算法中語句執行次數為乙個常數,則時間複雜度為o(1) 常見的時間複雜度有:常數階o(1),對數階o(log2n),線性階o(n), 線性對數階o(nlog2n),平方階o(n2),立方階o(n3),..., k次方階o(nk),指數階o(2n)。隨著問題規模n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。

【空間複雜度】

乙個演算法的空間複雜度s(n)定義為該演算法所耗費的儲存空間,它也是問題規模n的函式。空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的量度。乙個演算法在計算機儲存器上所占用的儲存空間,包括儲存演算法本身所占用的儲存空間,演算法的輸入輸出資料所占用的儲存空間和演算法在執行過程中臨時占用的儲存空間這三個方面。當乙個演算法的空間複雜度為乙個常量,即不隨被處理資料量n的大小而改變時,可表示為o(1);當乙個演算法的空間複雜度與以2為底的n的對數成正比時,可表示為0(10g2n);當乙個演算法的空i司複雜度與n成線性比例關係時,可表示為0(n)。

常用的演算法的時間複雜度和空間複雜度:

排序法最差時間分析

平均時間複雜度

穩定度空間複雜度

氣泡排序

o(n2)

o(n2)

穩定o(1)

快速排序

o(n2)

o(n*log2n)

不穩定o(log2n)~o(n)

選擇排序

o(n2)

o(n2)

穩定o(1)

插入排序

o(n2)

o(n2)

穩定o(1)

堆排序o(n*log2n)

o(n*log2n)

不穩定o(1)

以上演算法的c++實現,見「c++知識要點」博文。

排序演算法複雜度

在這篇裡,來記述下排序演算法複雜度,空間 時間 時間複雜度 對排序資料的總的操作次數。反映當n變化時,操作次數呈現什麼規律。空間複雜度 是指演算法在計算機內執行時所需儲存空間的度量,它也是資料規模n的函式。穩定 如果a原本在b前面,而a b,排序之後a仍然在b的前面。不穩定 如果a原本在b的前面,而...

排序演算法複雜度

時間複雜度 基數排序的空間複雜度為o n 排序方法 最好情況 最壞情況 平均情況 穩定性 空間複雜度 氣泡排序 o n o n2 o n2 穩定 快速排序 o nlogn o n2 o nlogn 不穩定 簡單選擇排序 o n2 不穩定 堆排序 o nlogn 不穩定 直接插入排序 o n o n2...

各種排序演算法時間複雜度及空間複雜度

平均o n 2 最壞o n 2 最好o n 輔助記憶體o 1 穩定排序 最好情況是加了改進方法的最好 即冒泡的過程中檢查是否發生了交換,如果沒有發生交換,說明都排好序了,就break 插入 平均o n 2 最壞o n 2 最好o n 輔助記憶體o 1 穩定排序 直接選擇排序 平均o n 2 最壞o ...