【数据结构】排序(1)

目录

一、概念:

二、直接插入排序:

三、希尔排序:

四、直接选择排序:

五、堆排序:

六、冒泡排序:


一、概念:

排序的概念:

        使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

排序又分为内部排序和外部排序:

内部排序:数据元素全部放在内存中的排序。

外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

常见的排序算法:

二、直接插入排序:

基本思想

待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

例如在我们玩扑克牌斗地主时的码牌操作中就运用到了这个思想。

代码实现:

当插入第i(i>=1)个元素时,前面的a[0],a[1],…,a[i-1]已经排好序,此时用a[i]的排序码与 a[i-1],a[i-2],…的排序码顺序进行比较,找到插入位置即将a[i]插入,原来位置上的元素顺序后移即可。

//时间复杂度: O(N^2)	逆序
//最好的情况: O(N)	顺序有序
void InsertSort(int* a, int n)
{for (int i = 0; i < n - 1; i++)// i小于n-1是为下面条件做铺垫,防止越界{// 设置end为下标,将其与tmp下标位置的数进行比较,并不断更新endint end = i;int tmp = a[end + 1];// 在单趟排序中,tmp固定// 设置数组最小数的条件while (end >= 0){// 对tmp和end位置数进行比较if (tmp < a[end]) {// 将end位置数复制在end+1处,本质上是更新去排序后对应的位置a[end + 1] = a[end];end--;// 更新end}else{break;}}// 将tmp数放入对应的位置a[end + 1] = tmp;}
}

直接插入排序的特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1),它是一种稳定的排序算法 
  4. 稳定性:稳定

三、希尔排序:

又称缩小增量排序 

基本思想:

先选定一个整数gap,把待排序文件中所有记录分成gap个组,所有距离为gap的记录分在同一组内,并对每一组内的元素进行排序。

gap越大,大的值更快调到后面,小的值可以更快的调到前面,越不接近有序。

gap越小,跳的越慢,但是越接近有序,如果gap == 1,就是直接插入排序。

代码实现:

void ShellSort(int* a, int Size)
{int gap = Size;// gap > 1时是预排序,目的让他接近有序// gap == 1是直接插入排序,目的是让他有序while (gap > 1){gap = gap / 3 + 1;//保证最后一次gap是1,就是直接插入排序,但是数列已经非常接近有序了//gap代表的是有多少组// 这里就跟直接插入排序的模板一样for (int i = 0; i < Size - gap; i++){int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}

希尔排序的特性总结:

  1. 希尔排序是对直接插入排序的优化。

  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,就是直接插入排序。

  3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多。

  4. 时间复杂度(平均):O(N^1.3)

  5. 空间复杂度:O(1)

  6. 稳定性:不稳定。

四、直接选择排序:

基本思想:

每一次从待排序的数据元素中选出最小/最大的一个元素,存放在序列的起始/末尾位置,直到全部待排序的数据元素排完 。

代码实现:

  • 在元素集合a[i]--a[n-1]中选择关键码最大(小)的数据元素
  • 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换
  • 在剩余的a[i]--a[n-2](a[i+1]--a[n-1])集合中,重复上述步骤,直到集合剩余1个元素
// 时间复杂度: O(N^2)
// 最好的情况: O(N^2) 即使原本就有序,还是要暴力取数
// 空间复杂度: O(1)
void SelectSort(int* a, int Size)// 升序
{//设置下标int begin = 0;while (begin < Size){int min = begin;// 暴力选数for (int i = begin + 1; i < Size; i++){if (a[i] < a[min]){min = i;}}swap(a[begin], a[min]); //这里的swap使用的是库函数中写好了的,// 使用自己写的注意形参与实参begin++;}
}

直接选择排序的特性总结:

  1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

五、堆排序:

基本思想:

利用堆删除思想来进行排序使用向下调整。需要注意的是排升序要建大堆,排降序建小堆。

代码实现:

// 向下调整:升序建大堆
void AdjustDown(int* a, int size, int parent)
{int child = parent * 2 + 1;// 一层层的往下判别while (child < size){// 在保证不越界的前提下找出数大的子节点if (child + 1 < size && a[child + 1] > a[child]){child++;}if (a[child] > a[parent]){swap(a[child], a[parent]);// 这里的swap使用的是库函数中写好了的,// 使用自己写的注意形参与实参// 更新父,子节点parent = child;child = child * 2 + 1;}else{break;}}
}// 升序
void HeapSort(int* a, int Size)
{// O(N)// 要排升序,所以建大堆->找最后一个分叶节点向下调整,然后向前依次操作for (int i = (Size - 1 - 1) / 2; i >= 0; i--)// Size是个数,要下标所以-1,结合找最后一个分叶结点公式化简{AdjustDown(a, Size, i);}// O(N*logN)int end = Size - 1;while (end > 0){swap(a[0], a[end]);// 在向下调整使用end时,取的值是小于end,默认忽略最后一位,由前Size-1个数进行向下调整AdjustDown(a, end, 0);end--;}
}

堆排序的特性总结:

  1. 堆排序使用堆来选数,效率就高了很多。

  2. 时间复杂度:O(N*logN)

  3. 空间复杂度:O(1)

  4. 稳定性:不稳定

六、冒泡排序:

基本思想:

       两两元素相比,前一个比后一个大就交换,直到将最大/最小(升序/降序)的元素交换到末尾位置。这为一趟;一共进行 n-1 趟这样的交换将可以把所有的元素排序好。

代码实现:

//时间复杂度: O(N^2)	乱序
//最好的情况: O(N)   有序
void BubbleSort(int* a, int Size)
{// n个数只需排 n - 1 躺即可for (int i = 0; i < Size - 1; i++){// 设置一个条件,判断一趟排序下来是否有位置交换bool exchange = false;for (int j = 1; j < Size - i; j++){if (a[j - 1] > a[j]){swap(a[j - 1], a[j]); // 这里的swap使用的是库函数中写好了的,// 使用自己写的注意形参与实参exchange = true;}}// 如果单趟下来并没有数交换位置则说明这个数列本就有序if (exchange = false){break;}}
}

冒泡排序的特性总结:

  1. 冒泡排序是一种非常容易理解的排序
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:稳定 

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

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

相关文章

【电路笔记】-RC放电电路

RC放电电路 文章目录 RC放电电路1、概述2、RC放电电路3、RC放电电路示例当电压源从完全充电的 RC 电路中移除时,电容器 C 将通过电阻 R 放电。 1、概述 RC 放电电路利用电阻器-电容器组合的固有 RC 时间常数以指数衰减率对电容器进行放电。 在之前的 RC 充电电路教程中,我们…

向量的组成

向量是有序的一维数组&#xff0c;其中包含多个标量元素。每个元素都有一个索引&#xff0c;表示其在向量中的位置。在数学表示中&#xff0c;我们通常用小写粗体字母表示向量&#xff0c;如 v。 关于向量、张量、标量与矩阵的关系可以参见另一篇文章&#xff1a;线性代数&…

开源免费的NTFS for mac工具mounty

开源免费的NTFS for mac工具mounty 安装依赖 brew install gromgit/fuse/ntfs-3g-macbrew install --cask macfuse安装mounty 如果已经安装macFUSE和ntfs-3g-mac&#xff0c;可以直接点击下载的dmg安装包&#xff0c;安装升级。第一次启动mounty&#xff0c;你需要接受一系列…

Go slice的底层实现原理?

切片是基于数组实现的&#xff0c;它的底层是数组&#xff0c;可以理解为对 底层数组的抽象。 源码包中src/runtime/slice.go 定义了slice的数据结构&#xff1a; type slice struct {array unsafe.Pointerlen intcap int }slice占用24个字节 array: 指向底层数组的指针…

项目优化-

前言 用户浏览菜品&#xff0c;添加购物车&#xff0c;下单等操作最终都会反映成一个sql&#xff0c;操作数据库。 但是当前系统只部署了一台数据库&#xff0c;读和写所有压力都由一台数据库承担&#xff0c;压力大&#xff1b;如果数据库服务器磁盘损坏则数据丢失&#xff0…

【这个词(Sequence-to-Sequence)在深度学习中怎么解释,有什么作用?】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;深度学习笔记 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Sequence-to-Sequence&#xff08;Seq2Seq&#xff09; Sequence-to-Sequence&#xff08;Seq2Seq…

【论文阅读】ICCV 2023 计算和数据高效后门攻击

文章目录 一.论文信息二.论文内容1.摘要2.引言3.主要图表4.结论 一.论文信息 论文题目&#xff1a; Computation and Data Efficient Backdoor Attacks&#xff08;计算和数据高效后门攻击&#xff09; 论文来源&#xff1a; 2023-ICCV&#xff08;CCF-A&#xff09; 论文团…

免费的个人电脑防火墙软件 Windows

除了Windows自带的防火墙功能外&#xff0c;下面几个老牌的个人防火墙 ZoneAlarm Free Firewall&#xff1a;ZoneAlarm Free Firewall 是一款功能强大且易于使用的防火墙软件&#xff0c;提供实时保护、应用程序控制和高级防火墙功能。 Comodo Firewall&#xff1a;Comodo Fir…

【DDD】学习笔记-薪资管理系统的测试驱动开发

回顾薪资管理系统的设计建模 在 3-15 课&#xff0c;我们通过场景驱动设计完成了薪资管理系统的领域设计建模。既然场景驱动设计可以很好地与测试驱动开发融合在一起&#xff0c;因此根据场景驱动设计的成果来开展测试驱动开发&#xff0c;就是一个水到渠成的过程。让我们先来…

List集合之UML、特点、遍历方式、迭代器原理、泛型、装拆箱及ArrayList、LinkedList和Vector的区别

目录 ​编辑 一、什么是UML 二、集合框架 三、List集合 1.特点 2.遍历方式 3.删除 4.优化 四、迭代器原理 五、泛型 六、装拆箱 七、ArrayList、LinkedList和Vector的区别 ArrayList和Vector的区别 LinkedList和Vector的区别 一、什么是UML UML&#xff08;Unif…

springboot2.x集成Mybatis-Plus、druid、TDengine

1、将mybatis-plus升级到3.5以上&#xff1a; <!-- 支持tdengine&#xff0c;mybatis-plus需要升级到3.5.3 --><dependency><groupId>com.taosdata.jdbc</groupId><artifactId>taos-jdbcdriver</artifactId><version>3.2.8</vers…

前端项目打包体积分析与优化

一、安装依赖分析工具 npm install webpack-bundle-analyz 二、修改webpack.config.js文件 1、导入上面下载的包 2、在plugins里创建实例 三、启动打包命令 npm run build 会弹出如下界面&#xff1a; 四、优化 1、通过CDN导入react-dom文件 修改webpack.config.js文件里…

24-2-23

练习题 P1480 A/B Problem # A/B Problem ## 题目描述 输入两个整数 $a,b$&#xff0c;输出它们的商。 ## 输入格式 两行&#xff0c;第一行是被除数&#xff0c;第二行是除数。 ## 输出格式 一行&#xff0c;商的整数部分。 ## 样例 #1 ### 样例输入 #1 10 2 ### …

【Python_PySide6学习笔记(三十四)】组合选择框QComboBox类的基本用法

组合选择框QComboBox类的基本用法 组合选择框QComboBox类的基本用法前言正文1、创建组合选择框2、组合选择框添加多个选项3、组合选择框清空选项4、组合选择框添加单个选项5、组合选择框清除选项6、组合选择框获取当前选项文本7、组合选择框获取当前选项索引8、组合选择框信号:…

Windows 远程控制 Mac 电脑怎么操作

要从 Windows 远程控制 Mac 电脑&#xff0c;您可以使用内置 macOS 功能或第三方软件解决方案。以下是一些方法&#xff1a; 一、使用内置 macOS 功能&#xff08;屏幕共享&#xff09; 1、在 macOS 上启用屏幕共享 转至系统偏好设置 > 共享&#xff1b;选中“屏幕共享”…

八、线性代数二 ,矩阵的秩

目录 1、矩阵子式的定义与子式个数的计算&#xff1a; 2、矩阵秩的定义&#xff1a; 3、矩阵秩的计算方法&#xff1a; 4、矩阵秩的 性质&#xff1a; 线性代数四——几个重要的矩阵点积_线性代数 矩阵点积-CSDN博客 1、矩阵子式的定义与子式个数的计算&#xff1a; 概念&…

C# OpenCvSharp 利用白平衡技术进行图像修复

目录 效果 灰度世界(GrayworldWB)-白平衡算法 完美反射(SimpleWB)-白平衡算法 基于学习的(LearningBasedWB)-白平衡算法 代码 下载 C# OpenCvSharp 利用白平衡技术进行图像修复 OpenCV xphoto模块中提供了三种不同的白平衡算法&#xff0c;分别是&#xff1a;灰度世界(G…

华清远见嵌入式学习——驱动开发——day9

目录 作业要求&#xff1a; 作业答案&#xff1a; 代码效果&#xff1a; ​编辑 Platform总线驱动代码&#xff1a; 应用程序代码&#xff1a; 设备树配置&#xff1a; 作业要求&#xff1a; 通过platform总线驱动框架编写LED灯的驱动&#xff0c;编写应用程序测试&…

危险!Wyze 摄像头安全漏洞致1.3万用户隐私遭窥探

最近&#xff0c;一则关于 Wyze 摄像头再次出现安全漏洞的新闻引起了人们的广泛关注。据报道&#xff0c;该安全漏洞导致约1.3万用户的摄像头受到了未经授权的访问&#xff0c;使得这些用户的隐私信息遭到了窥视。这一事件再次引发了人们对网络安全的关注和讨论。 网络安全不仅…

代码随想录算法训练营第36天| Leetcode 435. 无重叠区间、763.划分字母区间、56. 合并区间

文章目录 Leetcode 435. 无重叠区间Leetcode 763.划分字母区间Leetcode 56. 合并区间 Leetcode 435. 无重叠区间 题目链接&#xff1a; Leetcode 435. 无重叠区间 题目描述&#xff1a; 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回需…