|
|
|
@ -0,0 +1,69 @@
|
|
|
|
|
/*原理:典型的牺牲空间换时间的做法。将待排的元素作为下标,记录元素出现次数,并进行
|
|
|
|
|
累计,最终反向填充目标数组,达成排序目的。 */
|
|
|
|
|
/*时间复杂度:O(N);
|
|
|
|
|
空间复杂度:O(N)*/
|
|
|
|
|
/*应用场景:计数排序只适用于数据范围较集中的序列的排序,如年龄排序等问题。
|
|
|
|
|
若待排序列的数据较分散,则会造成空间浪费,
|
|
|
|
|
并且计数排序只适用于整型排序,不适用与浮点型排序。
|
|
|
|
|
*/
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <time.h>
|
|
|
|
|
|
|
|
|
|
#define N 300000000 //元素个数
|
|
|
|
|
#define M 100 //元素区间
|
|
|
|
|
|
|
|
|
|
//数组打印
|
|
|
|
|
void arr_print(int* arr)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
for(i=0;i<N;i++)
|
|
|
|
|
{
|
|
|
|
|
printf("%3d",arr[i]);
|
|
|
|
|
}
|
|
|
|
|
printf("\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//计数排序:统计次数、依序填入
|
|
|
|
|
void sort_count(int* arr)
|
|
|
|
|
{
|
|
|
|
|
int i,j,k;
|
|
|
|
|
//统计数组中各元素出现的次数
|
|
|
|
|
int count[M]={0};
|
|
|
|
|
for(i=0;i<N;i++)
|
|
|
|
|
{
|
|
|
|
|
//双重下标之后的元素值++,计数的经典操作
|
|
|
|
|
count[arr[i]]++; //巧合:下标值和元素值对应
|
|
|
|
|
}
|
|
|
|
|
//依序填入数组中
|
|
|
|
|
k=0; //数组元素放入位置
|
|
|
|
|
for(i=0;i<M;i++) //外层控制元素进入
|
|
|
|
|
{
|
|
|
|
|
for(j=0;j<count[i];j++) //内层控制元素填入次数
|
|
|
|
|
{
|
|
|
|
|
arr[k++]=i; //k++自增,依序填入i值
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main()
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
int *arr=(int*)malloc(N*sizeof(int));
|
|
|
|
|
time_t start,end;
|
|
|
|
|
srand((unsigned int)time(NULL));
|
|
|
|
|
for(i=0;i<N;i++)
|
|
|
|
|
{
|
|
|
|
|
arr[i]=rand()%M;
|
|
|
|
|
}
|
|
|
|
|
printf("随机数生成:\n");
|
|
|
|
|
//arr_print(arr);
|
|
|
|
|
printf("计数排序结果:\n");
|
|
|
|
|
start=time(NULL);
|
|
|
|
|
sort_count(arr);
|
|
|
|
|
end=time(NULL);
|
|
|
|
|
printf("计数排序时长:%d s\n", end-start);
|
|
|
|
|
//arr_print(arr);
|
|
|
|
|
system("pause");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|