線性時間排序

2021-08-16 17:50:51 字數 1951 閱讀 1699

【決策樹模型】

用處:證明基於比較的排序的時間複雜度為ω(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.插入排序,歸併排序,堆排序和快速排序那些是穩定的,有沒有一種...