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

排序算法---计数排序

原创不易,转载请注明出处。欢迎点赞收藏~

计数排序(Counting Sort)是一种线性时间复杂度的排序算法,其核心思想是通过统计待排序元素的个数来确定元素的相对位置,从而实现排序。

具体的计数排序算法步骤如下:
1. 找出待排序数组中的最大值,并创建一个统计数组count[],其长度为最大值加1。
2. 遍历待排序数组,统计每个元素出现的次数,将统计结果存储在count[]数组中。count[i]表示元素i出现的次数。
3. 对count[]数组进行累加,得到每个元素在排序后的数组中的最后一个位置。即count[i]表示小于等于元素i的元素个数。
4. 创建一个临时数组temp[],其长度与待排序数组相同。
5. 逆序遍历待排序数组,根据count[]数组中的记录,将每个元素放入temp[]数组中的正确位置。
6. 将temp[]数组的元素复制回待排序数组,完成排序。

计数排序的时间复杂度为O(n+k),其中n是待排序数组的长度,k是待排序数组中的最大值。由于需要创建额外的count[]和temp[]数组,所以空间复杂度为O(n+k)。

需要注意的是,计数排序适用于元素范围较小且非负整数的排序,如果待排序数组包含负数或者小数,则需要进行适当的转换或调整。计数排序是稳定的排序算法,因为相同元素的相对顺序在排序后保持不变,但它不是基于比较的排序算法,因此在某些情况下比其他排序算法更高效。

下面是一个使用C语言实现的计数排序示例:

#include <stdio.h>void counting_sort(int arr[], int n)
{int max = arr[0];// 找出最大值for (int i = 1; i < n; i++){if (arr[i] > max){max = arr[i];}}// 创建统计数组count[],并初始化为0int count[max + 1];for (int i = 0; i <= max; i++){count[i] = 0;}// 统计每个元素的次数for (int i = 0; i < n; i++){count[arr[i]]++;}// 累加count[]数组,表示小于等于元素i的元素个数for (int i = 1; i <= max; i++){count[i] += count[i - 1];}// 创建临时数组temp[],存储排好序的元素int temp[n];// 根据count[]数组中的记录,将元素放入temp[]数组的正确位置for (int i = n - 1; i >= 0; i--){temp[count[arr[i]] - 1] = arr[i];count[arr[i]]--;}// 将temp[]数组的元素复制回原数组arr[]for (int i = 0; i < n; i++){arr[i] = temp[i];}
}int main()
{int arr[] = {9, 3, 6, 1, 3, 2, 9, 0};int n = sizeof(arr) / sizeof(arr[0]);printf("排序前的数组:\n");for (int i = 0; i < n; i++){printf("%d ", arr[i]);}counting_sort(arr, n);printf("\n排序后的数组: \n");for (int i = 0; i < n; i++){printf("%d ", arr[i]);}putchar('\n');return 0;
}

这段代码实现了计数排序算法。主要包括以下步骤:

1.遍历数组找出最大值,确定统计数组count[]的长度。
2.创建并初始化统计数组count[],长度为最大值加1。
3.遍历数组,统计每个元素的出现次数,存储在count[]中。
4.累加count[]数组,表示小于等于元素i的元素个数。
5.创建临时数组temp[],用于存储排好序的元素。
6.逆序遍历原数组,根据count[]数组中的记录,将元素放入temp[]数组的正确位置。
7.将temp[]数组的元素复制回原数组arr[],完成排序。

运行如上代码,你可以看到以下输出:

http://www.lryc.cn/news/300234.html

相关文章:

  • STM32——LCD(1)认识
  • iTop-4412 裸机程序(二十二)- RTC时钟
  • Kafka 之 AdminClient API
  • Flutter run 一直 Running Gradle task ‘assembleDebug’…
  • kali无线渗透之用wps加密模式破解出wpa模式的密码12
  • 【Python】高级数据类型
  • 挑战杯 python区块链实现 - proof of work工作量证明共识算法
  • 如何给最小化安装的CentOS主机装个远程桌面?
  • 知识图谱:py2neo将csv文件导入neo4j
  • 备战蓝桥杯---图论之最短路Bellman-Ford算法及优化
  • C++ //练习 5.19 编写一段程序,使用do while循环重复地执行下述任务:首先提示用户输入两个string对象,然后挑出较短的那个并输出它。
  • 算法刷题:有效三角形个数
  • python---变量
  • 数据库第二次实验
  • 容器高级知识:Kubernetes Pod 适配器模式详解
  • 云原生容器化-5 Docker常见操作命令
  • 几道简单的题目练一下手感
  • 2023年哪个前端框架用的最多?
  • 基于BitVM的乐观 BTC bridge
  • 谷歌浏览器安装扩展程序axure-chrome-extension
  • C++学习:大小写转换
  • 【王道数据结构】【chapter5树与二叉树】【P159t16】
  • 代码随想录算法训练营第51天 | 139.单词拆分 多重背包理论基础
  • weilai8游戏爬虫
  • 【Java程序设计】【C00261】基于Springboot的休闲娱乐代理售票系统(有论文)
  • 【Linux】学习-基础IO拓展篇
  • 算法详解(力扣141——环形链表系列)
  • 浅谈路由器交换结构
  • Linux第51步_移植ST公司的linux内核第3步_添加修改设备树
  • 【PyTorch】PyTorch中张量(Tensor)统计操作