十大排序简介

十大排序简介

  • 一、排序分类
  • 二、排序思路
    • 1.冒泡排序(Bubble Sort)
    • 2.选择排序(Selection Sort)
    • 3.插入排序(Insertion Sort)
    • 4.希尔排序(Shell Sort)
    • 5.归并排序(Merge Sort)
    • 6.快速排序(Quick Sort)
    • 7.堆排序(Heap Sort)
    • 8.计数排序(Counting Sort)
    • 9.基数排序(Radix Sort)
    • 10.桶排序(Bucket Sort)
  • 三、 稳定性
  • 四、时空复杂度

十大排序是在计算机地界儿最常用和最重要的排序算法,分别是:冒泡、选择、插入、希尔、归并、快速、堆、计数、基数、桶。
速记:冒(帽)选插(差)希(西)归,快堆计(妓)基(鸡)桶。帽子都能给爷选差了,要你们有什么用?送你们回西天吧!来来来,快把这些吃闲饭的歌妓和小鸡都堆到桶里,拎到西天送给佛祖。

一、排序分类

按照排序的实现方式,十种排序算法可分为:

1.比较类排序:

  • 交换类:冒泡排序、快速排序。
  • 插入类:插入排序、希尔排序。
  • 选择类:选择排序、堆排序。
  • 归并类:归并排序。

2.非比较类排序:计数排序、桶排序、基数排序。

二、排序思路

以从小到大排序为例,各排序算法思路如下。

1.冒泡排序(Bubble Sort)

将列表分为两部分,左无序,右有序。遍历时比较相邻两元素,顺序不对就交换,每遍历一次就能将无序列表中的最大元素逐步"冒泡"到列表的末尾。这样重复遍历无序列表,就能实现整个列表的排序。

时间复杂度:O(n^2^)

2.选择排序(Selection Sort)

左无序,右有序。每次从无序列表中选择最大值,放在最后(交换)。

时间复杂度:O(n^2^)

3.插入排序(Insertion Sort)

左有序,右无序。将无序列表第一个元素往前移动,放在第一个比它小的数的后边,从而得到新的有序列表。

时间复杂度:O(n^2)(对于大部分情况),O(n) 在最佳情况下(数据已接近有序)

4.希尔排序(Shell Sort)

是插入排序的一种改进版本,通过先比较距离较远的元素,再逐步缩小间隔进行插入排序。

插入排序的增量可视为1,在某些极端情况下效率较差。而希尔排序改为设立增量序列,按增量序列执行多次插入排序。

希尔排序的时间复杂度与增量序列的选取有关,一般用n除以2一直除到1的序列,但不是最优算法。

时间复杂度:取决于间隔序列的选择,通常为 O(n7/6)。

5.归并排序(Merge Sort)

采用分治法,先分后合。即先将列表分成两半分别排序,再合并已排序的两部分。

时间复杂度:O(n log n)。

空间复杂度:O(n)(需要额外的存储空间用于合并)

6.快速排序(Quick Sort)

采用分治法,在列表中选择一个基准值,然后分区(将列表分割成两部分,比基准值小的放在左侧,大的放在右侧),然后递归每个分区(即按上面的方面此这两部分数据分别进行快速排序)。

快速排序的基准值选择不当可能导致时间复杂度退化,解决办法有随机选值(随机选取基准值)、三数取中(头尾中,三数取中间值作为基准值)等。

时间复杂度:O(n log n)(平均情况),O(n^2)(最坏情况,但可以通过随机选择基准元素等方法改进)

7.堆排序(Heap Sort)

将无序部分构建成一个大顶堆,然后依次堆顶元素(最大值)与末尾元素交换,并重新调整堆结构。算法类似于选择排序。

时间复杂度:O(n log n)

空间复杂度:O(1)(原地排序/就地排序)

8.计数排序(Counting Sort)

适用于一定范围内的整数排序,通过计数元素出现的次数来确定每个元素在排序后的位置。

具体方法是借助数组下标有序,先存入数组并统计个数,再遍历赋值回原数组。

时间复杂度:O(n + k)(k 是待排序数据的范围)

空间复杂度:O(k)

9.基数排序(Radix Sort)

按位(从最低有效位到最高有效位或从最高有效位到最低有效位)对数字进行排序,通常使用计数排序作为子过程。

从最低有效位到最高有效位的基数排序,可以设立0~9十个桶数组,将待排序数按个位放入桶中,依次拿出,再按十位、百位,重复上述过程。

时间复杂度:O(n * k)(k 是数字的最大位数)

空间复杂度:O(n + k)(取决于使用的计数排序的空间需求)

10.桶排序(Bucket Sort)

将待排序数据分到有限数量的桶中,每个桶再分别排序(通常使用其他排序算法),然后依次合并各个桶中的数据。

也就是说,通过映射函数将待排序数据分组,对每个组选择合适的排序算法排序后,遍历每个桶,依次赋值回原数组。

时间复杂度:O(n + k)(k 是桶的数量,且每个桶中的数据均匀分布)

空间复杂度:O(n + k)

三、 稳定性

排序前如果a等于b,a在b的前面,排序后a仍在b的前面,则称该排序算法稳定。
稳定排序 :冒泡排序、插入排序、归并排序、计数排序、桶排序、基数排序。
不稳定排序 :快速排序、堆排序、选择排序、希尔排序。

速记:不稳定的排序有"快选堆希(吸)"。想象眼前是一堆堆的饮料,快选一堆来吸。

四、时空复杂度

十大排序的时空复杂度列表如下:

n表示待排序数据规模,k表示待排序数据范围,对数以2为底。

相关推荐
Dizzy.51719 分钟前
数据结构(查找)
数据结构·学习·算法
分别努力读书3 小时前
acm培训 part 7
算法·图论
武乐乐~3 小时前
欢乐力扣:赎金信
算法·leetcode·职场和发展
'Debug3 小时前
算法从0到100之【专题一】- 双指针第一练(数组划分、数组分块)
算法
Fansv5874 小时前
深度学习-2.机械学习基础
人工智能·经验分享·python·深度学习·算法·机器学习
yatingliu20195 小时前
代码随想录算法训练营第六天| 242.有效的字母异位词 、349. 两个数组的交集、202. 快乐数 、1. 两数之和
c++·算法
uhakadotcom5 小时前
Google DeepMind最近发布了SigLIP 2
人工智能·算法·架构
三年呀6 小时前
计算机视觉之图像处理-----SIFT、SURF、FAST、ORB 特征提取算法深度解析
图像处理·python·深度学习·算法·目标检测·机器学习·计算机视觉
淡黄的Cherry6 小时前
istio实现灰度发布,A/B发布, Kiali网格可视化(二)
java·算法·istio
Onlooker1296 小时前
LC-单词搜索、分割回文串、N皇后、搜索插入位置、搜索二维矩阵
算法·leetcode