這個方法很牛逼,這個排序方法不再像前面那些排序方法一樣根據比較來進行。
時間複雜度為O(k+n+k+n+n)=O(n),當k=O(n)時,可以保證時間複雜度為O(n),就可以用計數法來進行排序了。
這個方法的一個前提是必須要知道要排序的數組中元素的取值範圍。
#include <string.h>#include <time.h>#define BUFFER_SIZE 10void CountingSort(int *a,int len,int k){//a[]中的數在0~k之間 int i=0;int c[k+1];int b[len+1];int tmp=0;for(i=0;i<=k;i++){//計數清零,複雜度O(k)c[i]=0;}for(i=1;i<=len;i++){//開始計數,複雜度O(n)c[a[i]]++;}for(i=1;i<=k;i++){//複雜度O(k)c[i]+=c[i-1];//c[i]中裝的是小於等於i的數的個數 } for(i=len;i>0;i--){//按著計數來排序,複雜度O(n)。之所以從len到著來排序,是為了保持穩定性。tmp=a[i];b[c[tmp]]=tmp;c[tmp]--;}for(i=1;i<=len;i++){//把數組再複製回a中a[i]=b[i];}}int main(){int i=0;int a[BUFFER_SIZE+1]; //隨機產生數組 srand((unsigned)time(NULL));for(i=1;i<=BUFFER_SIZE;i++){a[i]=rand()%(BUFFER_SIZE+1);} printf("隨機產生的數組:\n");for(i=1;i<=BUFFER_SIZE;i++){printf("%d ",a[i]);} printf("\n");CountingSort(a,BUFFER_SIZE,BUFFER_SIZE);printf("對數組進行計數排序:\n"); for(i=1;i<=BUFFER_SIZE;i++){printf("%d ",a[i]);}system("pause");return 0;}