高速排序演算法的效能分析
參考資料
高速排序是一種分治排序演算法。它將陣列劃分為左右兩個部分,然後分別對這兩部分排序。關鍵在劃分的過程中。它將重排陣列,使的下面條件成立:
我們通過劃分完畢排序。然後遞迴的呼叫該方法處理子檔案,每一次劃分都會至少使乙個元素放到它終於的位置上。
void quick_sort(item a, int l, int r)
int partation(item a, int l, int r) //劃分函式
exch(&a[i], &a[r]); //交換劃分元素到它終於位置
return i;
}
劃分過程是不穩定的,由於每乙個元素都有可能被移到大量和它相等的元素(未經檢測到)的後面。
至今,沒有基於陣列的高速排序時穩定的。
時間複雜度o(
n22)
次比較假設呼叫乙個大小為n的有序檔案,那麼全部的劃分都將退化。程式會呼叫自身n次,每次呼叫降低乙個元素(左側n-1個。右側1個……);
n+(n−1)
+(n−
2)+…
…+2+
1=(n
+1)n
2時間複雜度o(
nlgn
)次比較
假設每次劃分都可以恰好把檔案切割成大小相等的兩部分,即滿足分治法
遞迴樹的深度是lg
n,每層的比較o(
n)t(n
)=2t
(n/2
)+n
上式中最後一項的
f(n)=
n是用於分解問題的代價(次數)
由主定理的情形2,
f(n)=n=
nlog
22lo
g0n所以
t(n)=nl
og22
∗log
1n=n
lgn時間複雜度o(
nlgn
)次比較
直觀來看就是,最好情況和最壞情況每層交替出現
在乙個差的劃分後接乙個好的劃分,下面配圖《演算法導論》p99
1.《演算法:c語言實現》p192
2.《演算法導論》p98
3. 主定理:
最基本的演算法(1) 交換
交換演算法在c c 中有以下幾種實現方式 1.實現交換演算法 include using namespace std intmain 2.做成通用的函式 值傳遞 include using namespace std void swap int a,int b int main void swap ...
1 最基本的演算法 交換
c c 中交換演算法的幾種方式 1 include2 include3 4 using namespace std 5 第二種方法,定義乙個函式 6void swap int x,int y 7 第三種方法,8void swap1 int px,int py 9 第四種方法,巨集定義 10 defi...
高速訊號分析的幾個基本問題
1 為什麼要用訊號的上公升 下降 時延長短來判斷是否為高速訊號?a 訊號越 陡 需要保持訊號完整的頻率分量也就越多 福利葉變換可知 一般數碼訊號保持5倍頻最多,因為取5倍頻已經考慮到了訊號90 的能量 又不同頻率的訊號有不同的傳輸特性,傳輸使用的頻帶越寬傳輸特性越複雜。如,同樣是150m訊號,如果取...