计数排序:
基本思想:对每一个输入元素x,确定出小于x的元素个数。有了这一信息,就可以把x直接放到它在最终输出数组中的位置上。例如,如果有17个元素小于x,则x就属于第18个输出位置。
时间复杂度:O(k+n),n为输入元素个数,假设所有输入元素都不大于k。
空间方面则额外用到了两个数组,一个用来统计,一个用来存放排序结果。所以也是O(n+k) ;
#include<stdio.h>
#define N 50
void CountingSort(int *A,int *B,int n,int k) ;
int main(void)
{
int i,n,k ;
int A[N],B[N] ;
freopen("in.txt","r",stdin) ;
while(scanf("%d%d",&n,&k) != EOF )
{
for(i = 1 ; i <=n ; ++i)
{
scanf("%d",&A[i]) ;
}
printf("You have input the List:\n") ;
for(i = 1 ; i <=n ; ++i)
{
printf("%-3d",A[i]) ;
}
CountingSort(A,B,n,k) ;
printf("\nAfter Sort:\n") ;
for(i = 1 ; i <= n ; ++i)
{
printf("%-3d",B[i]) ;
}
printf("\n\n") ;
}
return 0 ;
}
void CountingSort(int *A,int *B,int n,int k)
{
int i ;
int C[N] ;
for(i = 0 ; i <= k ; ++i)
{
C[i] = 0 ;
}
for(i = 1 ; i <= n ; i++)
{
C[A[i]]++ ;
}
for(i = 1 ; i <= k ; i++ )
{
C[i] += C[i-1] ;
}
for(i = n ; i >= 1 ; --i)
{
B[C[A[i]]] = A[i] ; ;
C[A[i]]-- ;
}
}