最近一直忙着学校的创新项目的事情,一直没能够更新博客,今天抽出时间写一个计数排序
传说它的
时间复杂度达到了O(nlgn)
下面我们就来看看它的经典之处吧!
首先a[n]是一列 小于等于k的正整数,
定义一个临时的数组c[k+1]和一个待排序好的数组b[n];
下面正如正题
下面是源码
#include "stdio.h"
#include "time.h"
#include "stdlib.h"
int main()
{
int a[11],b[11],c[6];
int temp;
for (int i = 1 ; i < 6 ; ++i)
{
c[i] = 0 ;
}
srand(unsigned(time(NULL)));
for (i = 1 ; i < 11 ; ++i )
{
temp = rand()%6;
while ( temp == 0 )
{
temp = rand()%6;
}
a[i] = temp ;
}
printf("未排序的数列\n");
for (i = 1 ; i < 11 ; ++i )
{
printf("%d ",a[i]);
}
printf("\n");
//循环计数,计算出1-k出现的次数,并且存放在相应的位置
for (i = 1 ; i < 11 ; ++i )
{
c[a[i]]++;
}
// 统计出小于等于i的数的个数,确定存放在b中的位置
for (i = 2 ; i < 6 ; ++i )
{
c[i] = c[i] + c[i-1];
}
for ( i = 10 ; i >= 1 ; --i ) //选择位置,可能看起来数组很多,但是下面会有图片讲解,当然图片是借鉴别人的
{
b[c[a[i]]] = a[i];
c[a[i]]--; //这里是将数值为a[i]的个数减一,相同的数字会放在同一个位置
}
printf("排序后的数列\n");
for (i = 1 ; i < 11 ; ++i )
{
printf("%d ",b[i]);
}
return 0;
}