当前位置: 首页 > news >正文

【C语言】排序算法 -------- 计数排序

在这里插入图片描述
个人主页
创作不易,感谢大家的关注!
在这里插入图片描述
在这里插入图片描述

文章目录

  • 1. 计数排序的概念
  • 2. 计数排序使用场景
  • 3. 计数排序思想
  • 4. 计数排序实现过程
  • 5. 计数排序的效率
  • 6. 总结(附源代码)

1. 计数排序的概念

计数排序是一种非比较的排序算法,其基本思想是统计待排序元素中小于等于每个元素的个数,从而确定每个元素的位置。

2. 计数排序使用场景

计数排序适用于以下几种情况:

  1. 数据的取值范围比较小,序列中最大值和最小值之间的差值不能过大,防止建立数组时造成内存浪费。
  2. 数据是整数类型,不能为浮点数类型。

3. 计数排序思想

计数排序的核心是:利用数组的索引是有序的前提下,通过将序列中的元素作为索引,其个数作为值放入数组,遍历数组来排序。

4. 计数排序实现过程

方法步骤如下:

  1. 先选出待排序序列中的最小数和最大数。
  2. 给出一个范围range,为 max-min+1。
  3. 创建一个count数组,大小为每个元素的大小。
  4. 遍历待排序数组,统计每个元素出现的次数,并将其存储在count数组中。
  5. 本质是利用count数组的自然序号排序。根据count数组中的元素,遍历依次更新待排序数组中的元素,实现排序。
  6. 统计count数组里的每个元素出现的次数,然后映射给tmp数组。(使用相对映射)
  7. 将tmp数组里不为0的元素的下标+min反赋给数组count,遍历结束,排序完成。

5. 计数排序的效率

时间复杂度:O(N+range),N为待排序序列的长度,range为max-min+1的大小。
空间复杂度:O(range)。
稳定性:稳定。

6. 总结(附源代码)

#define _CRT_SECURE_NO_WARNINGS 1void PrintArray(int* a, int n);void CountSort(int* a, int n);void PrintArray(int* a, int n)
{for (int i = 0; i < n; i++){printf("%d ", a[i]);}printf("\n");
}
//时间复杂度:O(N+range)
//只适合整数/适合范围集中
//空间复杂度:O(range)
void CountSort(int* a, int n)
{int min = a[0], max = a[0];for (int i = 1; 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));if (count == NULL){perror("calloc fail");return;}// 统计次数for (int i = 0; i < n; i++){count[a[i] - min]++;}// 排序int j = 0;for (int i = 0; i < range; i++){while (count[i]--){a[j++] = i + min;}}free(count);
}void TestSort()
{int a[] = { 6,1,2,9,4,2,4,1,4 };PrintArray(a, sizeof(a) / sizeof(int));CountSort(a, sizeof(a) / sizeof(int));PrintArray(a, sizeof(a) / sizeof(int));
}int main()
{TestSort();return 0;
}

在这里插入图片描述
今天的分享就到这里啦,感谢大家的支持,我们下次再见!

相关文章:

  • 课时158:脚本发布_简单脚本_远程执行
  • 线程相关的基本方法
  • 什么是内存泄漏?如何避免?
  • Android --- 异步操作
  • vscode插件开发之 - 消息通信
  • Apache HttpClient总览
  • QSS/QFrame/connect/两个窗口界面的连接/窗口的优化
  • DoIP——step2:车辆发现
  • 内网穿透的原理:实现远程访问的技术揭秘
  • Aeron:两个代理之间的单向IPC(One-way IPC between two agents)
  • visual studio下载安装
  • 【MySQL基础随缘更系列】AB复制
  • 你是否感受到AI就在身边?
  • Leetcode - 132双周赛
  • 海康充电桩报文校验TCP校验和
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • github指令
  • happypack两次报错的问题
  • Java 内存分配及垃圾回收机制初探
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • leetcode-27. Remove Element
  • log4j2输出到kafka
  • Node + FFmpeg 实现Canvas动画导出视频
  • python 学习笔记 - Queue Pipes,进程间通讯
  • RxJS: 简单入门
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • vue的全局变量和全局拦截请求器
  • Webpack 4x 之路 ( 四 )
  • 闭包--闭包之tab栏切换(四)
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 分布式熔断降级平台aegis
  • 警报:线上事故之CountDownLatch的威力
  • 力扣(LeetCode)357
  • 应用生命周期终极 DevOps 工具包
  • 主流的CSS水平和垂直居中技术大全
  • #{}和${}的区别是什么 -- java面试
  • #ifdef 的技巧用法
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • $.ajax()
  • (pojstep1.1.2)2654(直叙式模拟)
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (三) diretfbrc详解
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net程序集学习心得
  • @Bean注解详解
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [Day 16] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • [FC][常见Mapper IRQ研究]
  • [GPT]Andrej Karpathy微软Build大会GPT演讲(上)--GPT如何训练
  • [JDBC-1] JDBC Base Template
  • [Linux]文件基础-如何管理文件
  • [luoguP2401] 不等数列
  • [Mac软件]Adobe XD(Experience Design) v57.1.12.2一个功能强大的原型设计软件