一般我們使用的堆排序,歸併排序都是屬於比較排序,也就是通過比較元素的大小來進行排序,可以通過決策樹分析出比較排序的時間下界是o(nlgn),堆排序和歸併排序都是漸進最優的比較排序演算法。還有其他的排序方法不是通過比較,下面總結一下:
大致思路是將陣列中所有元素對應小於這個元素的個數儲存起來,這樣我們可以直接知道這個元素的位置,因為可能出現相同的元素,所以我們從後面輸出而且每次找到乙個元素的位置後要把對應的小於x的個數減一,這樣再次輸出時就被會放到前乙個位置上。最後的時間很好是o(n),但是要開三個陣列,而且其中乙個陣列要開從0到所有比較的數中最大的數,所以是典型的空間換時間,如果比較的元素中有一些非常大就沒有辦法進行排序。
#include#includeusing namespace std;
const int maxnum = 0xffff;
const int maxsize = 0xff;
int length;
void countersort(int a, int b, const int k)
}int main()
countersort(a, b, max);
for (int i = 1; i <= length; i++)
cout << b[i] << " ";
cout << endl;
return 0;
}
基數排序就是用來排序一些位數相等的數時比較好,基本思路是從低位開始排序,再一位一位往前,總共排序位數d次,能夠確保完全拍好序,時間複雜度是o(d(n+k))。感覺跟桶排序是乙個意思,可能實現不一樣吧,自己寫的是感覺基數排序要靠桶排序實現,這兩差不多。
#include#includeusing namespace std;
const int maxsize = 0xfff;
int n;
void bucketsort(int a);
int getdigit(int num);
void pushnum(int a, int b[10][maxsize], int digit);
void collectnum(int a, int b[10][maxsize]);
int main()
void bucketsort(int a)
; int max = -1;
for (int i = 1; i <= n; i++)
if (max < a[i])
max = a[i];
int digit = getdigit(max);
for (int i = 1; i <= digit; i++) }
int getdigit(int num)//求所有數中位數最高的位數
return digit;
}void pushnum(int a, int b[10][maxsize], int digit)
}void collectnum(int a, int b[10][maxsize])
線性時間排序
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 ...
線性時間排序
決策樹模型 用處 證明基於比較的排序的時間複雜度為 nlgn 簡單描述 二叉樹,有n 個葉節點,則此樹在最茂盛的時候有最小的高度h lg n nlgn 因此至少需要nlgn次比較 計數排序 描述 對n個位於區間 0,k 的元素進行排序,複雜度為o n k 的穩定排序 c 11 include inc...