计数排序代码测试:
/***********************************************************************************
程序名称 :countingsort_test
功能描述 : 计数排序
修改历史 :
1.日 期 : 2015/10/7
作 者 : gqkly
内容 :
************************************************************************************/
#include <iostream>
#include <time.h>
using namespace std;
typedef int ElemType;
#define N 36
#define Init_A(A,n) {for(int i=0;i<n;i++)A[i]=rand()%90;}
void Counting_Sort(ElemType *A, int len,ElemType max);
void Print(ElemType *A,int len,char *string);
int main()
{
double time_start,time_end;
time_start=clock();
srand(NULL);
ElemType A[N];
Init_A(A,N);
Print(A,N,"Init:");
Counting_Sort(A,N,90);
Print(A,N,"\nCounting_Sort:");
time_end=clock();
cout<<"\ntime used:"<<time_end-time_start<<endl;
getchar();
return 0;
}
void Counting_Sort(ElemType *A, int len, ElemType max)
{
ElemType *B,*C;
B=(ElemType*)malloc(len*sizeof(ElemType));
C=(ElemType*)malloc(max*sizeof(ElemType));
memset(C,0,max*sizeof(ElemType));
memset(B,0,len*sizeof(ElemType));
for (int j=0;j<len;j++)
{
C[A[j]]++;
}
for (int i=1;i<max;i++)
{
C[i]+=C[i-1];
}
for (int j=len-1;j>=0;j--)
{
C[A[j]]--;//这两行代码的顺序跟《算法导论》伪代码顺序是相反的。
B[C[A[j]]]=A[j];
}
for (int i=0;i<len;i++)
{
A[i]=B[i];
}
free(B);
free(C);
}
void Print(ElemType *A,int len,char *string)
{
cout<<string<<endl;
for (int i=0;i<len;i++)
{
if (i%6==0)
{
cout<<endl;
}
if (A[i]/10==0)
{
cout<<" "<<A[i]<<" ";
}
else
cout<<A[i]<<" ";
}
cout<<endl;
}
运行结果: