计数排序及优化

🎉个人名片:

🐼作者简介:一名乐于分享在学习道路上收获的大二在校生
🐻‍❄个人主页🎉:GOTXX

🐼个人WeChat:ILXOXVJE
🐼本文由GOTXX原创,首发CSDN🎉🎉🎉
🕊系列专栏:零基础学习C语言----- 数据结构的学习之路
🐓每日一句:如果没有特别幸运,那就请特别努力!🎉🎉🎉
————————————————

 

🎉文章简介:

本篇文章对   计数排序   的相关知识详细讲解!

如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作动力的源泉,让我们一起加油,一起奔跑,让我们顶峰相见!!!🎉🎉🎉


目录

计数排序

基本思想:

图解:

 优化:

实现代码:

性能分析:


计数排序

基本思想:

计数排序与其他排序不同,它没有数据的比较;

基本思想是:计数+排序

计数:

先开一个大小为range(大小后面有讲)的数组tmp,遍历一遍待排序的数据,遍历到某个数据(如5)时,就在tmp数组中下标为5的位置上+1,遍历完待排数据,就计数完成;

排序:

计数完,只需要根据tmp数组,数据就是tmp组的下标,有多少个就是对应下标上的数据,例如

tmp[5]=3;即数据为5的有3个

图解:

 优化

为了避免空间的浪费,range的大小为待排数据打最大值减去最小值加1;

range=max-min+1;

例如:如果数据最小值为100,最大值为199,如果用上面的思想,就需要开辟空间为200个int数组,但是前面100个数组位置没有存储数据,就造成了空间浪费,这种情况就需要开100个int空间的数组,数组下标0的位置计数100的出现的次数,当排序时只需要相应的加上100(min)即可;

实现代码:

void CountSort(int* a,int n )
{
    //找出最大最小值
	int min = a[0], max = a[0];
	for (int i = 0; i < n; i++)
	{
		if (a[i] > max)
			max = a[i];

		if (a[i] < min)
			min = a[i];
	}
    //确定要开辟空间的大小
	int range = max - min+1;
	int* count = (int*)malloc(sizeof(int) * range);
	if (count == NULL)
	{
		perror("malloc fail");
		return;
	}
    //将开辟数组初始化为0
	memset(count, 0, sizeof(int) * range);
	//计数
	for (int i = 0; i < n; i++)
	{
		count[a[i]-min]++;
	}
	//排序
	int i = 0;
	for (int j = 0; j < range; j++)
	{
		while (count[j]--)
		{
			a[i++] = j + min;
		}
	}
}

性能分析:

时间复杂度:O(N+range)

空间复杂度:O(range)

稳定性:不稳定

  • 39
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 54
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值