#include <stdlib.h>
#include <time.h>
#include<stdio.h>
#define SIZE 200
int find_k(int [],int );
void count_sort(int [],out[],int );
int main(void)
{ // 初始化数组、打印数组
int input[SIZE];
srand(time(0));
for(int i=0;i<SIZE;i++)
input[i]=rand()%(2*SIZE);
printf("Before Sorting\n");
for (int i=0;i<SIZE;i++)
{
printf("%5d",input[i]);
if((i+1)%10==0)
putchar('\n');
}
putchar('\n');
//计时、排序
double time_start=clock();
int output[SIZE];
count_sort(input,output,SIZE);
double time_end=clock();
//打印排序后的数组
printf("After Sorting\n");
for (int i=0;i<SIZE;i++)
{
printf("%5d",output[i]);
if((i+1)%10==0)
putchar('\n');
}
putchar('\n');
printf("Consume:%.2f",(time_end-time_start)/CLOCKS_PER_SEC);
}
void count_sort(int inp[],int out[],int n)
{ int k=find_k(inp,n);
int *aux=(int *)malloc((k+1)*sizeof(int));
for(int i=0;i<k+1;i++)
aux[i]=0;
for(int j=0;j<n;j++)
aux[inp[j]]++;
for(int i=1;i<k+1;i++)
aux[i]+=aux[i-1];
for(int i=n-1;i>=0;i--)
{ out[aux[inp[i]]]=inp[i];
aux[inp[i]]--;
}
free(aux);
}
//寻找最大整数
int find_k(int arr[],int n)
{ int max=0;
for(int i=0;i<n;i++)
if(arr[i]>max)
max=arr[i];
return max;
}