计数排序
** 计数排序是一种非比较式算法,要求数据元素为整型。
** 设数据元素(整数)的个数为n,数据元素最大值和最小值的差值为m。如果m<nlog2n,计数排序算法的时间复杂度小于比较式排序算法。
说明:
我们还是以军训整理队列队伍为例子。
假设一排有10人,身高是[150,180]cm
那我们需要画出一个长度为180+1长度的数组 array里,然后将身高为t的人放到array[t]里面去,每放一个,array[t]++,就好比有多个160的人,他们只能共用一个坑一样。然后遍历数组array[180+1],把里面的人拿出来,遇到一个坑里有多个人的,得把这个坑里的人都拉出来后才能继续查看下一个坑。
可能有人会有疑问,既然是升高150—180,我们只需要挖180-150+1个坑就好了,干嘛挖180+1个坑,那么多个坑,放着多浪费啊,深有同感,因此我们在填坑的时候,可以把身高为t的同学放到t-min坑里去,大家的相对位置还是不变的。
<strong>
</strong><span style="font-size:14px;">#include<stdio.h>
#include<malloc.h>
#define N 10
void CountSort( int *cs , int n)
{
int min;
int max;
int i;
int *p_temp;
int arr_length;
//找出最大数和最小数
min=max=cs[0];
for(i=1;i<n;i++)
{
if(cs[i]>max)
max=cs[i];
if(cs[i]<min)
min=cs[i];
}
arr_length=max-min+1;
p_temp=(int *)malloc( arr_length*sizeof(int));
if(p_temp==NULL)
{
printf("Point error!\n");
return ;
}
//接下来是核心
//挖坑,
for( i=0; i<arr_length; i++)
p_temp[i]=0;
//把人扔进相应的坑里
for( i=0; i<n; i++)
{
p_temp[cs[i]-min]++;
}
//把坑里的人弄出来
int j_cs=0;
for(i=0; i<arr_length; i++)
{
//人数大于0的坑
while(p_temp[i]>0)
{
//把刚才给人家减去的身高加回来
cs[j_cs++]=i+min;
p_temp[i]--;
}
}
}
void display(int *p , int n)
{
int i;
for( i=0; i<n; i++)
{
printf("%d ",p[i]);
}
printf("\n");
}
int main()
{
int cs[N]={7,9,3,2,12,7,5,5,6,11};
printf("======计数排序前=====\n");
display( cs , N );
CountSort( cs, N);
printf("======计数排序后=====\n");
display( cs , N );
return 0;
}</span>