排序——计数排序

本文介绍了计数排序算法的概念,包括其工作原理(绝对映射和相对映射)、代码实现以及特性(如时间复杂度为O(MAX(N,范围)),空间复杂度为O(范围),稳定性),并通过示例展示了在特定场景下的应用。
摘要由CSDN通过智能技术生成

概念

计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。 [1] 当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(nlog(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(nlog(n)), 如归并排序,堆排序)

思路

  1. 统计相同元素出现次数
  2. 根据统计的结果将序列回收到原来的序列中

绝对映射:

在这里插入图片描述
要排序的数字是多少,对应存放的下标就是多少。

相对映射

在这里插入图片描述
使最小数据和0下标对应,其他数据-最小数据=该数据对应下标。
相对映射解决了决定映射不能存放负数和元素很大时浪费空间的缺点。

代码实现

void CountSort(int* a, int n)
{
	int min = a[0], max = a[0];
	for (int i = 0; i < n; i++)
	{
		if (a[i] < min)
		{
			min = a[i];
		}
		if (a[i] > max)
		{
			max = a[i];
		}
	}
	int range = max - min + 1;//找出最大最小值确定映射的范围
	int* count = (int*)calloc(range, sizeof(int));//用calloc可以把count数组初始化为0,方便后续计数统计
	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;//相对映射时减去了min,这里加上min得出原来的数据
		}
	}
}

特性

  1. 计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。
  2. 时间复杂度:O(MAX(N,范围))
  3. 空间复杂度:O(范围)
  4. 稳定性:稳定

结果演示

int main()
{

	int b[] = { 2,7,3,4,1,2,6,5,11,8 };
	int n2 = sizeof(b) / sizeof(b[0]);
	CountSort(b, n2);
printf("CountSort:");
	for (int i = 0; i < n2; i++)
	{
		printf("%d ", b[i]);
	}
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gsfl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值