算法 - 计数排序(Counting_Sort)

news/2024/5/14 20:13:31/文章来源:https://blog.csdn.net/weixin_45571585/article/details/126902698

目录

引言:

学习:

什么是计数排序(Counting_sort)?

定义:  

算法思想:

排序过程:

Step 1 :

Step 2 : 

Step 3 : 

Step 4 :  

Step 5 : 

依次进行填充的步骤: 

遍历临时数组空间并输出: 

实现: 

代码实现(C++):

程序可以改进的几个点: 

改进后用代码实现(C):

运行结果: 

总结:

参考资料:


引言:

今天在书上看到了计数排序,对计数排序的排序过程以及原理产生了兴趣并进行了学习最终用代码实现,计数排序属于8大主流排序中的一种,也是一种在不考虑空间的前提下快于任何排序算法的算法,这篇文章我将对计数排序的排序原理进行总结,在画板上对排序过程进行演示,并使用代码实现这个排序算法。

学习:

什么是计数排序(Counting_sort)?

在开始写计数排序的代码之前,我们先对计数排序的定义、算法思想、排序过程做一个简单的了解和梳理。

定义:  

计数排序(Counting_Sort)是一个非基于比较形式的排序算法,它也是一种以牺牲空间换取时间的过程。计数排序利用数组的有序性将元素依次存储进对应下标的数组空间中,然后再依次输出。

算法思想:

统计原来数组的数据,并将数据转换成下标存储到另外一个临时的空间里面,然后遍历临时空间把对应的下标值依次放回原数组,当遍历完临时空间并将对应的下标值全部依次放回原数组后就排好序了。

排序过程:

例如在这里我给出一组原始数据:

{1,3,2,5,5,6,9,8,2,4};

现在我们假设开辟的临时数组空间足够大的前提下,将数组空间画出来:

临时空间开辟完成后我们现在开始按照计数排序的规则对原始数据进行遍历并排序:

Step 1 :

遍历至原始数据的第一个数据1时,将1存储至开辟的临沭数组空间中的1号下标位置,如图:

Step 2 : 

遍历至第二个数据3时,我们再将3填充至对应的下标位置:

Step 3 : 

遍历至第三个数据2时,将2填充至对应下标位置:

Step 4 :  

遍历至第四个数据5时,将5填充至对应下标位置:

Step 5 : 

遍历至第五个数据时,我们本来应该将5填充至 [5]号下标的位置,但此位置在之前已经被5填充过了,所以此时我们将5进行叠加,也就是说此时5号下标位置有两个数据5,一前一后:

依次进行填充的步骤: 

按照上面的规律,我们将剩下的数据依次进行填充:

 

遍历临时数组空间并输出: 

此时填充完毕,将临时开放的数组空间进行遍历并输出,结果为:

1,2,2,3,4,5,5,6,8,9;

实现: 

代码实现(C++):

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int arr[11];//定义一个长度为11的数组
int main()
{int t = 0,n = 0;cin >> n;//输入要排序元素的个数for(int i = 1;i <= n;i++){//循环条件:当循环变量i小于元素个数cin >> t;//持续输入tarr[t]++;//将元素填充至arr数组中对应下标的位置}for(int i = 0;i <= n;i++){//循环条件:当循环变量i小于元素个数for(int j = 1;j <= arr[i];j++){//使用j下标对临时数组中每一个下标的空间进行遍历cout << i << " ";//输出元素}}return 0;
}

例如我在这里输入元素9个元素,运行结果为:

 

如图,成功的将输入的十个元素进行了升序排序:

程序可以改进的几个点: 

程序存在有这几个可以进行改进的地方:

1 : 程序只能对个位数字进行排序,可以将程序改进,让程序可以排序个位数字、十位数字、甚至是百位数字;

3 : 原程序是直接写在主程序中的,可以将排序封装为函数,在主程序中直接进行调用;

改进后用代码实现(C):

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<assert.h>
#include<time.h>
#define MAXSIZE 10
#define N 100
int temp[N];
void initar(int *ar,int len)//初始化ar,并将100以内的数组随机填充进ar数组中
{assert(ar != nullptr);for(int i = 0;i < len;i++){ar[i] = rand() % 100;}
}
void showar(int *ar,int len)//打印数组函数
{assert(ar != nullptr);for(int i = 0;i < len;i++){printf("%d ",ar[i]);}printf("\n--------------------------\n");
}
void Counting_Sort(int *ar,int len)//计数排序函数
{assert(ar != nullptr);for(int i = 0;i < len;i++)//将数据依次填充进临时空间temp中对应的下标位置temp[ar[i]]++;//按照元素编号依次填写进temp临时空间中for(int i = 0,j = 0;i < N;i++){//遍历临时数组空间中的元素并将其放入至ar数组中进行输出while(temp[i]--)//放一个减一个ar[j++] = i;}
}
int main()
{srand((unsigned int)time(NULL));int ar[MAXSIZE];initar(ar,MAXSIZE);printf("原始数据为:\n");showar(ar,MAXSIZE);printf("\n经过计数排序后的数据为:\n");Counting_Sort(ar,MAXSIZE);showar(ar,MAXSIZE);return 0;
}

运行结果: 

总结:

计数排序(Counting_Sort)是一种非基于比较形式的算法,在之前所实现过的冒泡排序、选择排序、插入排序等排序算法都是基于比较的算法,而计数排序则是利用了数组天然的有序性对数据进行归类划分,然后再对临时数组空间进行遍历并输出。

设输入的线性表长度为n,则计数排序的时间复杂度为O(n),这无异是快于前面所学习到的任何算法的,且时间复杂度极低,但这一切的条件都是以空间作为代价的。

计数排序对输入的数据有附加的限制条件:

1、输入的线性表的元素属于有限偏序集S;

2、设输入的线性表的长度为n,|S|=k(表示集合S中元素的总数目为k),则k=O(n)。

在这两个条件下,计数排序的复杂性为O(n)。

参考资料:

计数排序_百度百科

Cukor丘克 - 十大经典排序算法(C语言描述)

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

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

相关文章

单片机项目式实训总篇

采取新方法&#xff0c;让自己尽快变强&#xff0c;为了更好的再次见面。停止大脑内斗。 总学习目标&#xff1a;&#xff08;完成后此文字支持跳转&#xff09; 基础知识 端口操作 显示 高级输入 时间控制 综合 Flag: 一周破解C51程序 学习内容&#xff1a; 了解单片…

DeepExploit——当Metasploit遇上机器学习

Metasploit Meets Machine Learning 文章目录Metasploit Meets Machine Learning1. Metasploit准备1.1 与外部项目的合作1.1.1 启用RPC API1.1.2 使用RPC API操作Metasploit2. 创建机器学习模型2.1 DQN2.2 A3C2.2.1 CartPole2.2.2 分布式学习机制3. 深度利用3.1 代理任务3.2 当…

JVM——GC垃圾回收机制

文章目录JVM——GC垃圾回收机制一、如何判断哪些对象应该被回收——对象判活算法引用计数算法可达性分析算法引用最终判定二、对象应该怎么被回收——垃圾回收算法分代收集理论标记-清除算法标记-复制算法标记-整理算法三、内存对象什么时候被回收——触发条件年轻代GC(Minor G…

如期而至的SVN服务器迁移引来一个大瓜XAMPP

文章目录前言方案评估前奏XAMMP搭建svn服务准备软件包安装必要环境和工具安装xampp运行xampp编辑xampp访问xampp安装subversion安装svnmanager创建svn仓库目录修改配置文件为svnmanager创建MySQL用户重启xammp服务访问svnmanager登录svnmanager可能遇到的错误查看服务器目录信息…

10 nginx 中的 slab

前言 这里主要是描述 nginx 中的 slab 内存分配相关 slab 在很多的地方都有使用, 比如 linux, nginx, netty 等等 主要的作用是 内存管理, 复用 简略 nginx 中的 slab 的流程 # slab relatedvoid* poolPtr malloc(2048);ngx_slab_pool_t *pool (ngx_slab_pool_t *)poo…

Pytorch深度学习——线性回归实现 04(未完)

文章目录1 问题假设2 步骤3 学习使用Pytorch的API来搭建模型3.1 nn.Model3.2 优化器类3.3 评估模式和训练模式3.4 使用GPUdata和item的区别1 问题假设 假设我们的基础模型就是y wxb&#xff0c;其中w和b均为参数&#xff0c;我们使用y 3x0.8来构造数据x、y,所以最后通过模型…

0.django部署(基础知识)

我们前面的代码都是在我们自己的电脑&#xff08;通常是Windows操作系统&#xff09;上面运行的&#xff0c;因为我们还处于开发过程中。 当我们完成一个阶段的开发任务后&#xff0c;就需要把我们开发的网站服务&#xff0c;给真正的用户使用了。 那就需要我们的 网站 部署在…

【二次分配问题】基于遗传算法 (GA)、粒子群优化 (PSO) 和萤火虫算法 (FA) 求解二次分配( QAP)问题(MATLAB 实现)

目录 1 概述 3 Matlab代码及文章阅读 4 运行结果 4.1 萤火虫算法 4.2 粒子群优化算法 4.3 遗传算法 5 参考文献 1 概述 目前&#xff0c;该问题已经得到深入的研究&#xff0c;进化策略(evolutionstrategies)、遗传算法(genetic algorithms)、遗传规划(geneticprogramm…

警惕利用「以太坊合并」的 3 种骗局

原文作者&#xff1a;茉莉 距离以太坊合并还有不到 6 小时&#xff0c;这条被视作下一代互联网 Web3.0 底层基础设施的区块链网络将彻底改变共识机制&#xff0c;从工作量证明的 PoW 机制转向权益证明的 PoS。 在合并即将到来前&#xff0c;去中心化安全网络市场 PolySwarm 创…

各语言转wasm-js调用

起源是 我司应该是抄袭某家player , 也用wasm做的 , 所以我也研究一下 关于标题 我估计需要大家一起完善了 , 我只会讲一下 go c 别的都不会 webassembly( wasm ) 可以编译的如图 我想起我这边应用啊 也就无非播放器~~ 本地文件压缩啊加密啊或直接就上传了, 或者在操作数据…

RestHighLevelClient创建索引时报错[299 Elasticsearch-7.12.1

RestHighLevelClient创建索引时报错[299 Elasticsearch-7.12.1出现原因 : 这是因为在使用create方法时 , 会有两个选择 , 其中一个已经过时了 client.indices().create(request, RequestOptions.DEFAULT); 其中的create方法 , 有两个版本 , 有一个显示已经过时了 , 两个方法虽然…

蜂蜜什么时候喝,才可以获得蜂蜜更大的好处?真可以治疗咳嗽?

中秋节刚过去不久&#xff0c;家里面的礼品多的是不是可以开超市了?中国人讲究一个“礼”字&#xff0c;逢年过节、探望故友病友手里不带点东西就会难受。中秋节这样带有美好祝愿的节日自然也是中国人送礼的最佳时间之一。 ​ 编辑切换为居中 添加图片注释&#xff0c;不超过…

Google Chrome Privacy Sandbox All In One

Google Chrome Privacy Sandbox All In OneGoogle Chrome Privacy Sandbox All In OneGoogle Chrome 隐私沙盒chrome://settings/privacySandbox With Privacy Sandbox trials, sites can deliver the same browsing experience using less of your info. That means more priv…

需要在html中加CSS,怎么加

在html中加CSS有三种方式 一种是直接写到标签上的style属性里面 <divid"mydiV"style"width:200px;border:1pxsolid#f00;margin:0;"></div> 一种是写到head标签里面的style标签里面 <styletype"text/css"> #mydiV{ width:2…

C++ 01 内存模型

内存分区的示意图。一般内存主要分为&#xff1a;代码区、常量区、静态区&#xff08;全局区&#xff09;、堆区、栈区这几个区域。 什么是代码区、常量区、静态区&#xff08;全局区&#xff09;、堆区、栈区&#xff1f; 代码区&#xff1a;存放程序的代码&#xff0c;即CPU执…

springboot 整合dubbo3开发rest应用

一、前言 作为微服务治理生态体系内的重要框架 dubbo&#xff0c;从出身到现在历经了十多年的市场检验而依旧火热&#xff0c;除了其自身优秀的设计&#xff0c;高性能的RPC性能&#xff0c;以及依托于springcloud-alibaba的这个背后强劲的开源团队支撑&#xff0c;在众多的微…

MongoDB6安装配置详解

官网下载地址&#xff1a; https://www.mongodb.com/try/download/community?tckdocs_server 打开后是这样的&#xff1a; 鼠标滑到上图红色箭头位置&#xff0c;可以看到最新版本目前是6.0.1&#xff0c;点击download下载即可&#xff0c;这里下载的是Windows版本。 下载好后…

vue插槽---作用域插槽(三)

编译作用域:模板中的变量,在模板对应的实例中查找相应的变量和数据。通俗的说就是父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。 作用域插槽:带参数的插槽,子组件提供给父组件参数,父组件决定其展示形式替换插槽标签。 为什…

哈希原理及模拟实现并封装unordered系列关联式容器

目录一、哈希1. 哈希概念2. 哈希冲突3. 哈希函数4. 哈希冲突的解决闭散列线性探测二次探测开散列开散列与闭散列比较二、哈希表哈希表的实现三、封装unordered系列关联式容器1. 封装unordered_set2. 封装unordered_map四、哈希表的应用1. 位图概念2. 应用3. 位图的实现2. 布隆过…

springboot客户关系管理系统源码 CRM小程序源码

CRM客户关系管理系统源码 crm小程序源码 基于springbootvue MySQL数据库开发的客户关系管理系统。 客户全流程高效管理&#xff0c;客户资料管理&#xff0c;客户跟踪管理&#xff0c;订单、合同管理&#xff0c;回款及交付管理等功能。 功能介绍 1、系统管理&#xff1a;员工…