算法 - 排序

0. 总览

10大排序算法
  • 以上表格是基于 数组 进行排序的一般性结论
  • 稳定性:如果相等的2个元素,在排序前后的 相对位置保持不变,此为 稳定的排序算法
  • In-Place:原地算法,不依赖额外的资源 或者 依赖少数的额外资源,仅依靠输出 来 覆盖输入
  • 冒泡、选择、插入、归并、快速、希尔、堆排序,属于 比较排序(Comparision Sorting)

1. 冒泡排序(Bubble Sort)

冒泡排序
(1) 执行流程
  1. 从头开始比较每一对 相邻元素,如果第1个比第2个 大,就交换它们的位置
    执行完一轮后,最末尾的那个元素就是最大的元素

  2. 忽略①中曾经找到的最大元素,重复执行步骤①,直到全部元素有序

(2) 优化方案
  • 如果序列已经 完全有序,可提前终止冒泡排序
  • 如果序列尾部已经 局部有序,可记录最后1次交换的位置,减少比较次数
(3) 复杂度分析
  • 最好时间复杂度:O(n)
  • 最坏、平均时间复杂度:O(n^2)
  • 空间复杂度:O(1)
  • 稳定排序

2. 选择排序(Selection Sort)

选择排序
(1) 执行流程
  1. 从序列中找出 最大的那个元素,与 最末尾的元素 交换位置
    执行完一轮后,最末尾的那个元素就是最大的元素

  2. 忽略①中曾经找到的最大元素,重复执行步骤①,直到全部元素有序

(2) 优化方案
  • 使用 来选择最大值
(3) 复杂度分析
  • 最好、最坏、平均时间复杂度:O(n^2)
  • 空间复杂度:O(1)
  • 不稳定排序

3. 堆排序(Heap Sort)

堆排序
(1) 执行流程
  1. 对序列进行原地建堆(heapify)

  2. 重复执行以下操作,直到堆的元素数量为1
    ① 交换堆顶元素 与 为尾元素
    ② 堆的元素数量减1
    ③ 对0位置进行1次 siftDown操作

(2) 优化方案
  • 堆排序 可以认为是对 选择排序 的一种优化
(3) 复杂度分析
  • 最好、最坏、平均时间复杂度:O(nlogn)
  • 空间复杂度:O(1)
  • 不稳定排序

4. 插入排序(Insertion Sort)

插入排序
(1) 执行流程
  1. 在执行过程中,插入排序会将序列分为2部分
    头部是已经排好序的,尾部是待排序的

  2. 从头开始扫描每一个元素
    每当扫描到一个元素,就将它插入到头部合适的位置,使头部数据依然保持有序

(2) 优化方案
  • 方案一:将【交换】转为【挪动】
    ① 先将待插入的元素备份
    ② 头部有序数据中 比 待插入元素大的,都朝尾部方向挪动1个位置
    ③ 将待插入元素 放到最终的合适位置
  • 方案二:二分搜索
    ① 假设在 [begin, end) 范围内搜索某个元素v, mid = (begin + end) / 2
    ② 如果 v < m,去 [begin, mid) 范围内二分搜索
    ③ 如果 v > m,去 [mid + 1, end) 范围内二分搜索
    ④ 如果 v = m,直接返回 mid
(3) 复杂度分析
  • 最好时间复杂度:O(n)
  • 最坏、平均时间复杂度:O(n^2)
  • 空间复杂度:O(1)
  • 稳定排序

5. 归并排序(Merge Sort)

归并排序
(1) 执行流程
  1. 不断地将当前序列 平均分割成 2个子序列 - divide分割操作
    直到不能再分割(序列中只剩1个元素)

  2. 不断地将2个子序列 合并成 一个有序序列 - merge归并操作
    直到最终只剩下1个有序序列

(2) 优化方案
(3) 复杂度分析
  • 最好、最坏、平均时间复杂度:O(nlogn)
  • 空间复杂度:O(n)
  • 稳定排序

6. 快速排序(Quick Sort)

快速排序
(1) 执行流程
  1. 从序列中选择一个轴点元素(pivot)
    假设每次选择 0位置的元素 为轴点元素

  2. 利用 pivot 将序列分割成 2个子序列
    将小于 pivot 的元素放在 pivot前面(左侧)
    将大于 pivot 的元素放在 pivot后面(右侧)
    将等于 pivot 的元素放在 pivot任意一侧

  3. 对 子序列进行 ① ② 操作
    直到不能再分割(子序列中只剩下1个元素)

  • 快速排序的本质:逐渐将每一个元素都转换成 轴点元素
(2) 优化方案
  • 随机选择轴点元素 - 降低最坏情况的出现概率
(3) 复杂度分析
  • 最好、平均时间复杂度:O(nlogn)
  • 最坏时间复杂度:O(n^2)
  • 空间复杂度:O(nlogn)
  • 不稳定排序

7. 希尔排序(Shell Sort)

希尔排序
希尔排序图解
(1) 执行流程
  1. 把序列看作是一个 矩阵,分成m列,逐列进行排序

  2. m 从某个整数逐渐减为1

  3. 当m为1时,整个序列完全有序

(2) 优化方案
  • 矩阵的列数取决于 步长序列,选择最好的步长序列
  • 其最坏时间复杂度是 O(n^ \frac{4}{3} )
(3) 复杂度分析
  • 最好、平均时间复杂度:
  • 最坏时间复杂度:
  • 空间复杂度:O(1)
  • 不稳定排序


  • 冒泡、选择、插入、归并、快速、希尔、堆排序,都是基于 比较的排序
  • 平均时间复杂度最低是O(nlogn)
  • 计数排序、桶排序、基数排序,都不是基于 比较的排序
  • 典型的 用空间换时间,在某些时候,平均时间复杂度可以比O(nlogn) 更低


8. 计数排序(Counting Sort)

计数排序
(1) 执行流程

核心思想:统计每个整数 在序列中出现的 次数,进而推导出每个整数 在有序序列中的索引。

(2) 优化方案
  • 计数数组 区间为 [min, max]
  • 每个元素累加上 其前面的所有元素,得到元素在有序序列中的位置信息
(3) 复杂度分析
  • 最好、最坏、平均时间复杂度:O(n + k)
  • 空间复杂度:O(n + k)
  • 稳定排序
    *(k是整数的取值范围)

9. 基数排序(Radix Sort)

基数排序
(1) 执行流程

依次对 个位数、百位数、千位数、万位数... 进行排序(从低位到高位)

(2) 优化方案
(3) 复杂度分析
  • 最好、最坏、平均时间复杂度:O(d * (n + k))
  • 空间复杂度:O(n + k)
  • 稳定排序
  • (d是最大值得位数,k是进制)

9. 桶排序(Bucket Sort)

桶排序
(1) 执行流程
  1. 创建一定数量的桶
  2. 按照一定的规则,将序列中的元素 均匀分配到对应的桶
  3. 分别对每个桶进行 单独排序
  4. 将所有非空桶的元素 合并成有序序列
(2) 优化方案
(3) 复杂度分析
  • 最好、最坏、平均时间复杂度:O(n + k)
  • 空间复杂度:O(n + m)
  • 稳定排序
  • (m 是桶的数量,k 为 n * logn - n * logm
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,820评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,648评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,324评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,714评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,724评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,328评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,897评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,804评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,345评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,431评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,561评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,238评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,928评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,417评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,528评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,983评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,573评论 2 359

推荐阅读更多精彩内容