计数排序

计数排序

**  计数排序是一种非比较式算法,要求数据元素为整型。

** 设数据元素(整数)的个数为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>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值