排序算法入门(一)

194 阅读1分钟

前言

排序算法作为算法中较为基础的一部分,在大厂算法面试中的出现频率较高,本系列文章将以十大常见的排序算法为例,带大家逐步了解排序算法。

排序算法分类

十种常见排序算法可以分为两大类:

  • 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破 O(nlogn)O(nlogn),因此也称为非线性时间比较类排序。
  • 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。
graph LR
排序算法 --> 比较类排序
排序算法 --> 非比较类排序
比较类排序 --> 交换排序
交换排序 --> 冒泡排序
交换排序 --> 快速排序
比较类排序 --> 插入排序
插入排序 --> 简单插入排序
插入排序 --> 希尔排序
比较类排序 --> 选择排序
选择排序 --> 简单选择排序
选择排序 --> 堆排序
比较类排序 --> 归并排序
归并排序 --> 二路归并排序
归并排序 --> 多路归并排序
非比较类排序 --> 计数排序
非比较类排序 --> 桶排序
非比较类排序 --> 基数排序

排序算法复杂度

排序方法时间复杂度^①(平均)时间复杂度(最坏)时间复杂度(最好)空间复杂度^②稳定性^③
插入排序O(n2)O(n^2)O(n2)O(n^2)O(n)O(n)O(1)O(1)稳定
希尔排序O(n1.3)O(n^{1.3})O(n2)O(n^2)O(n)O(n)O(1)O(1)不稳定
选择排序O(n2)O(n^2)O(n2)O(n^2)O(n2)O(n^2)O(1)O(1)不稳定
堆排序O(nlog2n)O(nlog_2n)O(nlog2n)O(nlog_2n)O(nlog2n)O(nlog_2n)O(1)O(1)不稳定
冒泡排序O(n2)O(n^2)O(n2)O(n^2)O(n)O(n)O(1)O(1)稳定
快速排序O(nlog2n)O(nlog_2n)O(n2)O(n^2)O(nlog2n)O(nlog_2n)O(nlog2n)O(nlog_2n)不稳定
归并排序O(nlog2n)O(nlog_2n)O(nlog2n)O(nlog_2n)O(nlog2n)O(nlog_2n)O(n)O(n)稳定
计数排序O(n+k)O(n+k)O(n+k)O(n+k)O(n+k)O(n+k)O(n+k)O(n+k)稳定
桶排序O(n+k)O(n+k)O(n2)O(n^2)O(n)O(n)O(n+k)O(n+k)稳定
基数排序O(nk)O(n*k)O(nk)O(n*k)O(nk)O(n*k)O(n+k)O(n+k)稳定


① 时间复杂度:当 n(排序的数量)变化时,计算机的操作次数呈现的规律
② 空间复杂度:当 n 变化时,计算机内执行时所需的储存空间大小呈现3的规律
③ 稳定性:排序过程中,若如果比较的两个数相等,且排序后这两个数的前后顺序可能发生变动,则算法是不稳定的;反之则是稳定的。