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

目录

CountSort计数排序

整体思想

图解分析

代码实现

时间复杂度&优缺分析


CountSort计数排序

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

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

4. 稳定性:稳定 

整体思想

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

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
  • 计数Count[a[i]-min]++ (i++)
  • 相对隐射回去

注意tips

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

  • calloc>>>>>>calloc - C++ Reference (cplusplus.com)
  • Count的下标表示a的元素的范围
  • Count的元素表示a的元素出现的个数(计数)

图解分析

代码实现

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的数据范围)
  • 计数排序不需要比较元素大小
  • 优势:效率极高
  • 局限性:不适合范围很大,计数排序只适用于整型,不同数据类型的,实践意义不高。(现实实践,更多的是结构体排序,不能适用计数排序)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/494169.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s pv与pvc理解与实践

参考文章&#xff1a; https://blog.csdn.net/qq_41337034/article/details/117220475 一、 pv/pvc简述 Pv是指PersistentVolume&#xff0c;中文含义是持久化存储卷是对底层的共享存储的一种抽象&#xff0c;Pv由管理员进行配置和创建&#xff0c;只要包含存储能力&#xff…

Three.js-05坐标轴AxesHelper

1.构建对象 说明&#xff1a;参数一表示坐标轴的长度。红色代表 X 轴. 绿色代表 Y 轴. 蓝色代表 Z 轴. const axesHelper new THREE.AxesHelper( 1 ); 2.设置位置 axesHelper.position.y1 axesHelper.position.x1 axesHelper.position.z1 3. 网格 说明&#xff1a;立方体…

水印相机小程序源码

水印相机前端源码&#xff0c;本程序无需后端&#xff0c;前端直接导入即可&#xff0c;没有添加流量主功能&#xff0c;大家开通后自行添加 源码搜索&#xff1a;源码软件库 注意小程序后台的隐私权限设置&#xff0c;前端需要授权才可使用 真实时间地址拍照记录&#xff0c…

进程替换 ——exec族函数、线程

exec函数族 #include <unistd.h> //exec函数族的头文件 int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg, ...,char *const envp[]); int execv(const char *…

windows 文件授权问题

跨平台可执行权限介绍 在类 Unix 系统&#xff08;如 Mac, Linux&#xff09;中&#xff0c;执行权限是通过文件的权限位来控制的。而在 Windows 系统中&#xff0c;执行权限通常取决于文件扩展名和关联的执行程序&#xff0c;所以&#xff0c;当我们在跨平台的开发环境中&…

面试redis篇-13Redis为什么那么快

Redis是纯内存操作,执行速度非常快采用单线程,避免不必要的上下文切换可竞争条件,多线程还要考虑线程安全问题使用I/O多路复用模型,非阻塞IOI/O多路复用模型 Redis是纯内存操作,执行速度非常快,它的性能瓶颈是网络延迟而不是执行速度, I/O多路复用模型主要就是实现了高效…

win系统环境变量设置后不马上启用解决方法

目录 1. 刷新系统变量缓存2. 查看环境变量,检查是否真的保存成功了3. 重启系统(最后的玄学)总结 欢迎关注 『发现你走远了』 博客&#xff0c;持续更新中 欢迎关注 『发现你走远了』 博客&#xff0c;持续更新中 1. 刷新系统变量缓存 有时候系统会缓存环境变量&#xff0c;导致…

Zoho ToDo 满足您的需求:任务管理满足隐私和安全要求

任务管理工具已经成为我们日常生活中不可或缺的一部分&#xff0c;它们帮助我们处理各种事务&#xff0c;从杂项和愿望清单到管理截止日期和资源。这些工具不仅仅是简单的任务列表&#xff0c;它们掌握了项目的蓝图、雄心勃勃的目标和完成的最后期限。然而随着这些工具的使用越…

【LeetCode】【滑动窗口长度不固定】978 最长湍流子数组

1794.【软件认证】最长的指定瑕疵度的元音子串 这个例题&#xff0c;是滑动窗口中长度不定求最大的题目&#xff0c;在看题之前可以先看一下【leetcode每日一题】【滑动窗口长度不固定】案例。 题目描述 定义&#xff1a;开头和结尾都是元音字母&#xff08;aeiouAEIOU&…

Spring-Cloud-Gateway集成Sentinel限流

1&#xff09;gateway添加sentinel相关依赖 <spring-cloud.version>2021.0.1</spring-cloud.version> <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version><dependencies><!--gateway--><dependency><gro…

DALL·E 3:Improving Image Generation with Better Captions

论文链接&#xff1a;https://cdn.openai.com/papers/dall-e-3.pdf DALLE3 API&#xff1a;https://github.com/Agora-X/Dalle3 官网链接&#xff1a;添加链接描述 DALLE3讲解视频&#xff1a;B站视频 推荐DALLE2的讲解视频&#xff1a;B站&#xff1a;跟李沐学AI 之前精讲的DA…

Spring08、使用注解开发

8、使用注解开发 8.1、说明 在spring4之后&#xff0c;想要使用注解形式&#xff0c;必须得要引入aop的包 在配置文件当中&#xff0c;还得要引入一个context约束 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.sprin…