【決策樹模型】
用處:證明基於比較的排序的時間複雜度為ω(nlgn)
簡單描述:二叉樹,有n!個葉節點,則此樹在最茂盛的時候有最小的高度h = lg(n!) = ω(nlgn),因此至少需要nlgn次比較
【計數排序】
描述:對n個位於區間[0,k]的元素進行排序,複雜度為o(n+k)的穩定排序
c++11**:
#include #include using namespace std;
int main()
; vectorb(a.size(),0);
vectornum(10,0);
for(auto p : a)
++num[p];
//此時num[i]儲存的是p元素的個數
for(auto p = num.begin() + 1; p != num.end(); ++p)
*p += *(p-1);
//此時num[i]儲存的是小於等於i的元素的個數
for(auto p = a.rbegin(); p != a.rend(); ++p)
for(auto p : b)
cout<【基數排序】
描述:從最低位開始,對每一位進行複雜度為o(n)穩定的排序,若總位數為b,則基數排序的複雜度為o(bn)
c++**:
#include #include using namespace std;
int n;
struct data //待排資料
;void countingsort(data a);
int main()
for(int i = 0; i < 9; ++i) //對每一位進行計數排序
countingsort(data);
for(int i = 0; i < n; ++i)
cout<-1; --i)
//為下一次排序做鋪墊
for(int i = 0; i < n; ++i)
memcpy(a,temp,sizeof temp); //將排序後的temp陣列移植到原陣列
}
【桶排序】
描述:n個元素,n個桶將元素範圍分成n個區間。
精髓:每個區間元素出現的概率相等 --> o(n)
【線性時間原址排序】(無重複元素)
描述:額外儲存空間o(k)用於儲存每乙個元素的正確位置,然後乙個位置乙個位置地將每個元素歸位。
c++**:
#include using namespace std;
int main()
; int count[7] = ;
int startindex[7] = ;
for(int i=0; i<6; ++i) //每個元素的個數(事實上只有0和1)
++count[a[i]];
int sum = 0;
for(int i=0; i<7; ++i)
int sindex;
for(int i=0; i<6; ++i) //歸位 }
for(int i=0;i<6;++i) //輸出
cout<【變長資料項的排序】
①有一些不同位數的整數,所有整數的位數之和為n,如何在o(n)的時間內完成排序?
解法:先將整數按位數進行分段,段內進行基數排序 --> o(∑ 本段的元素個數 x 元素的位數) --> o(n)
②有一些長度不等的字串,所有字串的長度之和為n,如何在o(n)的時間內按字典序排序?
分析:可以將每個字串進行左對齊,尾部的空字元是為比任意字元小
解法:按長度分段,段內從尾部開始基數排序 --> o(n)
線性時間排序
public void radixsort int a a k key 我們前面提到的方法,基本上都是比較排序,本篇介紹三種非比較型別的排序,計數排序 基數排序 桶排序,比較排序的最壞的情況都是經過nlgn的,線性排序的時間複雜度基本上都是線性關係。1.計數排序 計數排序不是通過元素之間的比較,而是...
線性時間排序
在最壞情況下任何比較排序演算法都需要做 nlgn 次比較 計數排序 假設輸入的資料都屬於乙個小區間內的整數 counting sort a,b,k 1.let c 0.k be a new array 2.for i 0 to k 3.c i 0 4.for j 1 to a.length 5.c ...
線性時間排序習題
1.設計乙個演算法,對n個介於0 k之間的數進行預處理,然後能夠在o 1 的時間給出有多少個元素介於 a,b 之間 首先肯定要考慮a,b和k的相對大小,這裡就假設01.參照級數排序累計統計 2.對累計統計的結果中計算c b c a 1 2.插入排序,歸併排序,堆排序和快速排序那些是穩定的,有沒有一種...