演算法導論(8)

2021-07-22 22:52:20 字數 1910 閱讀 4271

快速排序是一種最壞情況執行時間為o(n*n),雖然這個最壞情況執行時間比較差,但快速排序通常都是用於排序的最 佳

的實用選擇,這是因為其平均效能相當好:期望的執行時間為o(nlgn),且o(nlgn)記號中隱含的常數因子很小。另 外,

它還能夠進行就地排序。

快速排序和合併排序一樣,採用的都是分治思想。快排中利用該思想解決步驟為:

1、先從陣列中取出乙個數作為基數,基數的選擇對排序效率的影響很大

2、分割槽,將比這個基數小的數全部放到它的左邊,比基數大的數全部放到其右邊

3、對左右兩個區間重複第二步,直到每個區間只有乙個數

下面結合**來進一步理解快速排序。演算法導論上一開始給出的基數選擇就是直接選擇待排序陣列中最後乙個元素作 為

基數,即對於陣列a[n],以a[n-1]作為基數。以一般情況來討論,當我們要進行排序的陣列為a[p...r]時,選擇a[r]為 基

數,然後將這個序列分為3部分,a[p...q-1],a[q], a[q+1, r],其中

a[p...q-1]的元素都是小於基數的,

a[q]就是基 數,

a[q+1, r]

的元素都大於基數。其實現**如下:

[cpp]view plain

copy

print?

intpartition (

inta, 

intp, 

intr)  

}  swap (a[++i], a[r]);  

return

i;  

}  

該函式的執行過程如下圖:

這個函式最後返回的便是q,接下來我們便要對a[p...q-1]和a[q+1, r]重複上述步驟,直到只剩下乙個元素。**如下:

[cpp]view plain

copy

print?

void

quick_sort (

inta, 

intp, 

intr)  

}  最後附上我自己的乙個完整的**,可以直接執行測試執行結果:

[cpp]view plain

copy

print?

#include

using

namespace

std;  

void

display (

inta, 

intn);  

void

swap (

int& n, 

int& m);  

intpartition (

inta, 

intp, 

intr);  

void

quick_sort (

inta, 

intp, 

intr);  

intmain()  

return

0;  

}  void

display (

inta, 

intn)  

void

swap (

int& n, 

int& m)  

intpartition (

inta, 

intp, 

intr)  

}  swap (a[++i], a[r]);  

return

i;  

}  void

quick_sort (

inta, 

intp, 

intr)  

演算法導論 第8章

這一章2個事情 1.決策樹。2.三種線性排序。關於決策樹 1.決策樹其實是對前面的堆排序,快排等是最優的比較演算法的證明。2.重要結論,定理8.1證明了任意乙個比較演算法在最壞情況下都需要做 n lg n 次的比較。3.這一節其實沒什麼內容,就是一點基本的概念,以及了解比較演算法可以通過轉換為決策樹...

演算法導論第8章習題

前面的排序都是基於比較排序,有時候不需要比較也可以排序。關鍵是那些東西有乙個好的表示,比如說整數。用decision tree證明,omega n lg n 是所有比較排序演算法的下界。決策樹中間節點表示比較的兩個東西,葉子節點表示元素的乙個置換,決策樹的每條邊表示這個演算法在這個節點獲得的比較資訊...

演算法導論 第8章 線性時間排序

比較排序指在排序的最終結果各元素的次序依賴於它們之間的比較的排序演算法。在最壞情況下,任何比較排序演算法都需要做 nlgn 次比較。因此堆排序和歸併排序都是漸近最優的比較排序演算法。本章討論三種用運算而不是比較來確定排序順序的線性時間複雜度的排序演算法 計數排序假設n個輸入元素中的每乙個都是在0 k...