【非比较排序】计算排序算法

目录

CountSort计数排序

整体思想

图解分析

代码实现

时间复杂度&优缺分析


CountSort计数排序

计数排序是一种非比较排序,不需要像前面的排序一样去比较。

**计数排序的特性总结:

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

4. 稳定性:稳定

整体思想

  • 思想:计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。
    1. 统计相同元素出现次数
    1. 根据统计的结果将序列回收到原来的序列中

Count数组

  • Count数组中的元素需要全部初始化为0(calloc就可以满足这个要求)
  • Count元素是 计算a数组元素个数出现的次数
  • Count数组的下标是a数组元素的范围
  • 绝对隐射:范围0~max(a中最大的元素)
  • 相对隐射:范围0~max-min <<<<<<<<< min~max
  • range = max-min+1(映射0~max-min,个数max-min+1)

整个流程

  • 遍历一遍:找到最大值 / 最小值
  • 计算出Count数组下标范围并且开辟动态空间
  • rangge=max-min+1
  • 计数Counta\[i-min]++ (i++)
  • 相对隐射回去

注意tips

  • i和j能不能公用❓
  • a数组的元素可以是负数吗?
  • 除了整型其他类型可以吗?
  • 后置--&前置--

图解分析

代码实现

cs 复制代码
void CountSort(int* a, int n)
{
	//找最大值/最小值/创建的tmp的范围在这个之间
	int max = a[0];
	int min = 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*)calloc(range, sizeof(int));
	//计数
	for (int j = 0; j < n; j++)
	{
		count[a[j]-min]++;
	}

	//相对隐射回去
	int i = 0;
	for (int k = 0; k < range; k++)
	{
		while (count[k]--)
		{
			a[i++] = k + min;
		}
	}
}

时间复杂度&优缺分析

时间复杂度:O(N)

  • 时间复杂度:O(a(N)+coun(N))(count的N是a的数据范围)
  • 计数排序不需要比较元素大小
  • 优势:效率极高
  • 局限性:不适合范围很大,计数排序只适用于整型,不同数据类型的,实践意义不高。(现实实践,更多的是结构体排序,不能适用计数排序)

🙂感谢大家的阅读,若有错误和不足,欢迎指正。下篇总结各个排序。

相关推荐
兰令水7 小时前
leecodecode【面试150】【2026.6.14打卡-java版本】
java·算法·面试
noipp14 小时前
推荐题目:洛谷 P10907 [蓝桥杯 2024 国 B] 蚂蚁开会
c语言·c++·算法·编程·洛谷
程序员二叉14 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
青山木15 小时前
Hot 100 --- 轮转数组
java·数据结构·算法
徐小夕15 小时前
Loop Engineering 深度解析与实战指南(全网最全)
前端·算法·github
北域码匠16 小时前
SHA-1算法:安全哈希原理与应用解析
算法·c#·哈希算法
努力小周16 小时前
STM32智能安防系统
c语言·stm32·单片机·嵌入式硬件·物联网·计算机网络·pcb工艺
手写码匠17 小时前
手写 GraphRAG:从零实现图增强检索增强生成系统
人工智能·深度学习·算法·aigc
BomanGe117 小时前
NSK重载高刚性滚珠丝杠技术详解
经验分享·算法·规格说明书
Matrix_1118 小时前
手机里的计算摄影:广角形变校正算法
人工智能·算法·智能手机·计算摄影