详解八大排序(五)------(计数排序,时间复杂度)

devtools/2024/11/24 6:49:36/

文章目录

  • 1. 计数排序(CountSort)
    • 1.1 核心思路
    • 1.2 实现代码
  • 2. 时间复杂度比较

1. 计数排序(CountSort)

1.1 核心思路

计数排序的核心思路是另外创建一个数组,记录原数组中出现的成员个数,再依次打印新数组中的成员个数。

在这里插入图片描述

以上述数组为例。已知数组中最小的数是1,最大的数是67.那么就需要开辟一个大小为max - min + 1的新数组。并且遍历原数组,将原数组成员的相应出现次数记录在新数组中。得到:

在这里插入图片描述

接着我们在遍历新数组,当新数组成员不等于0时,我们就打印相应的位置并且加上min。得到:

在这里插入图片描述

注意:由于计数排序需要另外开辟一个根据成员大小来决定大小的数组。所以计数排序的使用需要注意空间复杂度。当原数组的数据比较集中时,才推荐使用计数排序。

1.2 实现代码

// 计数排序
void CountSort(int* arr, int n)
{int max = arr[0], min = arr[0];for (int i = 1; i < n; i++){if (arr[i] > max)max = arr[i];if (arr[i] < min)min = arr[i];}//找到数组中的最大和最小值,方便开辟数组空间int range = max - min + 1;//数组的空间int* count = (int*)malloc(sizeof(int) * range);//开辟新数组countif (count == NULL)//count开辟失败就直接退出程序{perror("malloc fail!");exit(1);}memset(count, 0, sizeof(int) * range);//将新开辟的数组count的成员全部置于0for (int i = 0; i < n; i++){count[arr[i] - min]++;//已知数组的空间第一位是min,将arr[i] - min之后就是该成员在新数组的位置}int index = 0;for (int i = 0; i < range; i++)//将数组中全部的成员依次放回原数组{while (count[i]--)//count[i]表示该成员重复出现的次数{arr[index++] = i + min;//将排序完的数依次放回原数组中}}
}

2. 时间复杂度比较

在这里插入图片描述

根据时间复杂度来看,只推荐使用希尔排序,堆排序,快速排序,归并排序,计数排序。但是由于计数排序需要注意空间复杂度上面的问题,所以一般情况下,只推荐使用希尔,堆,快速,归并这四种排序方法。

另外关于“稳定性”,什么是稳定性?稳定性就是数组在排完序之后,原数组中成员的位置没有改变。例如:

在这里插入图片描述

上面的数组,将第一个出现的5定义为第一个5,第二个出现的5定义为第二个5,在排完序之后,应该是:

在这里插入图片描述

那么此时数组里的第一个5是不是刚才我们定义的第一个5呢?如果是,那么就可以说该排序方法具有稳定性;如果不是,则不具有稳定性。

以上就是所有的数组排序方法,可以根据具体的需求使用相应的排序方法。


http://www.ppmy.cn/devtools/136483.html

相关文章

SpringSecurity基于内存的多个登录用户支持

Spring Security 支持各种来源的用户数据&#xff0c;包括内存、数据库、LDAP 等&#xff0c;它们被抽象为一个 UserDetailsService 接口&#xff0c;任何实现了 UserDetailsService 接口的对象都可以作为认证数据源。在这种设计模式下&#xff0c;Spring Security 显得尤为灵活…

Android Activity 基础接口知识和常见问题

Activity 知识点及问题点 接口onMultiWindowModeChangedonConfigurationChanged 常见问题Android解决点击桌面图标&#xff0c;就重新启动应用程序问题 接口 onMultiWindowModeChanged 定义 onMultiWindowModeChanged是Android中Activity类的一个回调方法。它会在活动&#xf…

挂壁式空气净化器什么牌子净化好?测评高热度品牌排行

近年来&#xff0c;挂壁式空气净化器日益成为消费者关注的焦点。随着市场需求的激增&#xff0c;其品牌和型号亦愈发丰富。作为家电测评领域的专业人士&#xff0c;我已评测了众多挂壁式空气净化器&#xff0c;发现部分产品存在质量问题&#xff0c;净化效果不佳&#xff0c;尤…

第二十九章 TCP 客户端 服务器通信 - 记录的拼接

文章目录 第二十九章 TCP 客户端 服务器通信 - 记录的拼接记录的拼接多路复用 TCP设备正在关闭连接使用CLOSE命令断开连接 第二十九章 TCP 客户端 服务器通信 - 记录的拼接 记录的拼接 在某些情况下&#xff0c;TCP会将不同的记录连接在一起形成单个记录。如果客户端或服务器…

HTML5实现剪刀石头布小游戏(附源码)

文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面 2.效果和源码源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/143798520 HTM…

Linux安装RabbitMQ

安装步骤 rabbitmq使用erlang开发&#xff0c;依赖于erlang&#xff0c;所以需要先下载erlang&#xff0c;且版本要兼容&#xff1a; 可在官网查看erlang与rabbitmq的版本对应关系 https://www.rabbitmq.com/docs/which-erlangCentOs7安装运行 下载 下载地址 https://www.rab…

vue el-table表格点击某行触发事件操作栏点击和row-click冲突问题

文章为本新手菜鸡的问题记录&#xff0c;如有错误和不足还请大佬指正 文章目录 前言一、点击el-table表格某行&#xff0c;触发事件二、解决el-table的操作栏点击和row-click冲突问题1.问题&#xff1a;2.解决方法 前言 文章主要解决两个问题&#xff1a; 1、点击el-table表格…

【SQL Server】华中农业大学空间数据库实验报告 实验四 完整性约束

1.实验目的 通过理论课的学习与实验指导书的帮助&#xff0c;在实验课操作的基础上进一步理解数据库中&#xff0c;实现数据完整性的概念及实施数据完整性的重要性&#xff0c;同时掌握数据完整性的分类&#xff0c;体会数据完整性约束的作用&#xff0c;加深对数据完整性及其…