計數排序是一種線性時間排序方法,在以下條件滿足時對n個數的數組A[]進行排序,其時間爲O(n):
一:數組A[]中的元素的大小均小於k
二:k=O(n)
算法代碼如下:
#include <stdio.h>
#include <stdlib.h>
/**
* 計數排序
* a[] (input)要排序的數組
* b[] (output) 排序結果
* n (input) 排序的數字的個數
* k (input)對所有的i滿足:a[i]<k
*/
void count_sort(int a[],int b[],int n,int k)
{
int i = 0;
int* c = (int*)malloc(sizeof(int)*k);
//初始化
for(i = 0 ; i < k; i++)
{
*(c+i) = 0;
}
//計算各個元素的個數
for( i = 0; i < n; i++)
{
(*(c+a[i]))++;
}
for(i = 1; i < k; i++)
{
*(c+i) += *(c+i-1);
}
//輸出
for(i = n-1; i >= 0; i--)
{
b[*(c+a[i])-1] = a[i];
(*(c+a[i]))--;
}
free(c);
}
int main()
{
int i;
int a[] = {3,4,4,5,3,3,2,4,12,6,8};
int length = sizeof(a)/sizeof(a[0]);
int* b = (int*)malloc(sizeof(int)*length);
count_sort(a,b,length,47);
for(i = 0; i < length; i++)
printf("%d\t",b[i]);
}