排序算法 —— 计数排序

embedded/2024/10/24 7:20:11/

目录

1.计数排序的思想

2.计数排序的实现

3.计数排序的分析

时间复杂度

空间复杂度

稳定性

优点

缺点


1.计数排序的思想

顾名思义,计数排序就是通过计数的方式来排序,其基本思想为:

  • 开辟一个计数数组,统计每个数出现的次数。
  • 遍历计数数组,将计数数组中的值依次填入待排序序列中,覆盖原来的值之后,排序便完成了。

2.计数排序的实现

计数排序最核心的两步就是统计数据出现的次数根据数据出现的次数排序

但是统计数据出现的次数时,我们需要开辟新的数组空间,并且将待排序的元素直接映射计数数组的下标,让对应的位置++,表示统计出了数据出现的次数;这样计数有个缺陷就是,当待排序的序列中的元素取值的最小值不是0时,比如:100、156、195、 163 、 101 、 200。此时我们应该开辟多大的空间呢?应该如何计数呢?

如果我们直接开辟201个空间,也让元素的值作为数组下标,这样直接计数会有空间的浪费,所以,我们可以统计出最小元素和最大元素,最小元素和最大元素的差值就是要开辟的空间的大小,然后我们可以采用间接映射的方式,将待排序元素的数值映射到计数数组对应的位置上。如下图所示:

代码如下: 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>void CountSort(int* a, int n)
{// 统计出最小元素和最大元素 int min = a[0], max = a[0];int i = 0;for (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*)malloc(sizeof(int) * range);if (count == NULL){perror("malloc fail");return;}// 将开辟的空间全部初始化为0 memset(count, 0, sizeof(int) * range);// 统计数据出现次数for (i = 0; i < n; i++){count[a[i] - min]++;}// 排序int j = 0;for (i = 0; i < range; i++){while (count[i]--){a[j++] = i + min;}}
}int main()
{int nums[] = {4,5,8,7,9,6,2,1,3,0};CountSort(nums,10);int i = 0;while(i < sizeof(nums) / sizeof(int)){printf("%d ",nums[i]);	i++;}return 0;
}

3.计数排序的分析

时间复杂度

分析计数排序的代码可知,计数排序需要遍历待排序序列两次,一次是统计最小值和最大值,一次是统计数据出现的此时,这里的时间复杂度就是O(N)了;

正式排序的时候,需要在范围内排序,假设范围是range,时间复杂度就是O(range)。

  • 综上所述,计数排序的时间复杂度为O(N+range)

空间复杂度

  • 使用计数排序的时候,我们额外开辟了range个空间,所以空间复杂度是O(range)

稳定性

  • 计数排序不考虑稳定性,因为,相同的数都揉到一团去了,说不清稳不稳定了。

优点

  • 计数排序在数据相对集中的情况下效率很高

缺点

  • 计数排序需要映射下标,因此,计数排序只适用于整形数据

http://www.ppmy.cn/embedded/130022.html

相关文章

Vue封装组件并发布到npm仓库

前言 使用Vue框架进行开发&#xff0c;组件封装是一个很常规的操作。一个封装好的组件可以在项目的任意地方使用&#xff0c;甚至我们可以直接从npm仓库下载别人封装好的组件来进行使用&#xff0c;比如iview、element-ui这一类的组件库。但是每个公司的业务场景可能不同&…

数据结构《顺序表》

文章目录 前言一、什么是顺序表&#xff1f;1.1 顺序表的概念1.2 顺序表的建立 二、MyArrayList的实现三、顺序表的方法四、关于顺序表的例子总结 前言 提示&#xff1a;这里涉及到的ArrayList类是一个泛型类&#xff0c;同时后面的很多内容都会涉及到泛型&#xff0c;如果不了…

GRU神经网络理解

全文参考以下B站视频及《神经网络与深度学习》邱锡鹏&#xff0c;侧重对GPU模型的理解&#xff0c;初学者入门自用记录&#xff0c;有问题请指正【重温经典】GRU循环神经网络 —— LSTM的轻量级版本&#xff0c;大白话讲解_哔哩哔哩_bilibili 更新门、重置门、学习与输出 注&a…

Oracle 常见索引扫描方式概述,哪种索引扫描最快!

一.常见的索引扫描方式 INDEX RANGE SCANINDEX FAST FULL SCANINDEX FULL SCAN(MIN/MAX)INDEX FULL SCAN 二.分别模拟使用这些索引的场景 1.INDEX RANGE SCAN create table t1 as select rownum as id, rownum/2 as id2 from dual connect by level<500000; create inde…

.NET 9 - Static SSR pages in a globally-interactive app

1.简单介绍 .NET 9 Blazor 新增加的一个feature是在Interactive模式的Blazor站点中可以设定某个页面为Static SSR模式。 这边也简单尝试一下这个新的特性 2.具体说明 2.1 创建项目 1) 创建一个Blazor Web Assembly的项目&#xff0c; 2&#xff09;编辑App.razor <hea…

Burp Suite Professional 2024.9 for macOS x64 ARM64 - 领先的 Web 渗透测试软件

Burp Suite Professional 2024.9 for macOS x64 & ARM64 - 领先的 Web 渗透测试软件 世界排名第一的 Web 渗透测试工具包 请访问原文链接&#xff1a;https://sysin.org/blog/burp-suite-pro-mac/ 查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1…

腾讯云技术深度解析:构建高效云原生应用与数据安全管理

腾讯云技术深度解析&#xff1a;构建高效云原生应用与数据安全管理 在当今快速发展的技术环境中&#xff0c;云计算已经成为企业数字化转型的关键驱动力。腾讯云作为中国领先的云服务提供商&#xff0c;凭借其卓越的技术和创新能力&#xff0c;为企业提供了高效、可扩展的云原…

Leetcode—1117. H2O 生成【中等】(多线程)

2024每日刷题&#xff08;182&#xff09; Leetcode—1117. H2O 生成 C实现代码 class H2O { public:H2O() {sem_init(&hydrogenSem, 0, 1);sem_init(&oxygenSem, 0, 0);}~H2O() {sem_destroy(&hydrogenSem);sem_destroy(&oxygenSem);}void hydrogen(functio…