十大排序简介

十大排序简介

  • 一、排序分类
  • 二、排序思路
    • 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为底。

相关推荐
Felix_12153 小时前
2025 西电软工数据结构机考 Tip (By Felix)
算法
飞yu流星4 小时前
C++ 函数 模板
开发语言·c++·算法
pursuit_csdn4 小时前
力扣 74. 搜索二维矩阵
算法·leetcode·矩阵
labuladuo5204 小时前
洛谷 P8703 [蓝桥杯 2019 国 B] 最优包含(dp)
算法·蓝桥杯·动态规划
Milk夜雨5 小时前
C语言冒泡排序教程简介
数据结构·算法·排序算法
委婉待续5 小时前
redis的学习(三)
数据结构·算法
一直学习永不止步5 小时前
LeetCode题练习与总结:随机翻转矩阵--519
java·数学·算法·leetcode·哈希表·水塘抽样·随机化
xiao--xin5 小时前
LeetCode100之组合总和(39)--Java
java·开发语言·算法·leetcode·回溯
IT猿手6 小时前
部落竞争与成员合作算法(CTCM)求解5个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码
深度学习·算法·机器学习·matlab·无人机·无人机、
GISer_Jing7 小时前
React中 Reconciliation算法详解
前端·算法·react.js