//計數排序//適用於維數小,但記錄數龐大的資料集的排序任務//維數小是為了讓輔助數組小,使用的額外空間就小了。//時間複雜度為O(n)//空間複雜度就是輔助數組的長度,也就是維數max(a[i])+1的一個數組//比如:100萬學生的成績,成績範圍為0到720分。非常適合這種排序演算法#include <iostream>#include <time.h>#include <assert.h>using namespace std;void Counting_Sort(int a[],int n){//先求最大值,作為輔助數組的長度int max = a[0];for(int i=1; i<n; i++){if(max < a[i]){max = a[i];}}int *mark = new int[max+1];memset(mark,0,sizeof(int)*(max+1));for(int j=0; j<n; j++){mark[a[j]]++;}for(int k=1; k<=max; k++){mark[k] += mark[k-1];}int *p = new int[n+1];memset(p,0,sizeof(int)*(n+1));for(int h=n-1; h>=0; h--){p[mark[a[h]]-1]=a[h];mark[a[h]]--;}for(int g=0; g<n; g++){a[g] = p[g];}}void print(int a[],int n) { for(int i=0; i<n; i++) { cout<<a[i]<<" "; } cout << endl; } void main() { int a[10]; srand((unsigned)time(NULL));//初始化隨機數 for(int i=0; i<10; i++) { a[i]=rand()%20; } cout << "排序前:"; print(a,sizeof(a)/sizeof(a[0])); int n=sizeof(a)/sizeof(a[0]); Counting_Sort(a,n); cout << "排序後:"; print(a,sizeof(a)/sizeof(a[0])); }