归并排序、计数排序以及各种排序稳定性总结

归并排序

1.基本思想:

归并排序(MERGE - SORT)是建立在归并操作上的一种有效的排序算法, 该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

2.归并排序的实现(升序)

思路:两个有序区间的归并,依次进行比较,然后将小的插入到新的空间,但是先要让两个区间有序(递归)

1.递归版归并排序

测试

递归代码

2.非递归版归并排序(不能使用栈)

思路:(画图)

测试:

非递归代码

3.归并排序的特性总结:

  1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。

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

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

  4. 稳定性:稳定

4.归并排序性能测试

非比较排序

思想:计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。 操作步骤:

  1. 统计相同元素出现次数

  2. 根据统计的结果将序列回收到原来的序列中

非比较排序有基数排序、计数排序、桶排序等

计数排序:

思路:

1.统计每个数据出现的次数

2.排序:遍历一遍计数的数组,然后对着原数组进行从小到大按个数填充。每个数是几个就在原数组后依次写几个

计数排序的特性总结:

  1. 计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。

  2. 时间复杂度:O(N + range)

  3. 空间复杂度:O(范围)

  4. 稳定性:稳定

5.计数排序适合范围集中,且范围不大的整型数组排序,不适合范围分散或非整形的排序,如字符串、浮点数等

代码

稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i] = r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的

综上所述,稳定性也就是相同数据的相对位置在排序后是否改变,不变就是稳定的,否则就是不稳定的

1.稳定的排序:冒泡排序、插入排序、归并排序

2.不稳定的排序:选择排序、希尔排序、堆排序

注:

选择排序不稳定,比如2 2 1 1在排序时,交换第一个1和第一个2时,就让2不稳定了

相关推荐
wayz11几秒前
Day 2:线性回归原理与正则化
算法·机器学习·数据分析·回归·线性回归
QQ6765800811 分钟前
基于yolo26算法的水下目标检测图像数据集 海洋生物识别 海胆识别 海龟识别数据集 海洋生物监测与保护工作 潜水作业安全辅助系 水下环境感知第10408期
算法·目标检测·水下目标检测·海洋生物识别·海胆 海龟识别·海洋生物监测与保护工作·潜水作业安全辅助 水下环境感知
七颗糖很甜24 分钟前
基于 OpenCV 的 FY2 云顶图云块追踪算法实现
人工智能·opencv·算法
__Wedream__25 分钟前
NTIRE 2026 Challenge on Efficient Super-Resolution——冠军方案解读
人工智能·深度学习·算法·计算机视觉·超分辨率重建
yong158585534326 分钟前
Linux C++ 中的 volatile变量在多线程环境下进行运算的问题
c语言·c++
♛识尔如昼♛26 分钟前
C 基础(7) - 字符输入/输出和输入验证
c语言·开发语言
FL162386312929 分钟前
基于深度学习mediape实现人员跌倒人体姿势跌倒检测算法源码+说明文件
人工智能·深度学习·算法
wangwangmoon_light30 分钟前
1.23 LeetCode总结(树)_一般树
算法·leetcode·职场和发展
被考核重击31 分钟前
基础算法学习
学习·算法
creator_Li32 分钟前
Kafka 全面技术笔记
笔记·学习·kafka