常用排序算法汇总

197 阅读2分钟

排序算法基本定义:

  • 稳定性:排序前相等的两个数,在排完序后相对位置不变
  • 内排序:所有排序操作都在内存中完成
  • 外排序:大文件的排序,所以将数据放在磁盘中,通过磁盘和内存的数据传输进行排序
  • 时间复杂度:一个算法执行所耗费的时间
  • 空间复杂度:一个算法执行所需要的内存空间
排序算法时间复杂度空间复杂度排序方式稳定性
插入排序O(N^2)O(1)常数内存稳定
冒泡排序O(N^2)O(1)常数内存稳定
选择排序O(N^2)O(1)常数内存不稳定
快速排序O(N * logN)O(logN)常数内存不稳定
归并排序O(N * logN)O(N)额外内存稳定
堆排序O(N * logN)O(1)常数内存不稳定

注:插入排序在O(N^2)上常数项是极低的

简记不稳定性排序:选,快,对(堆),选的又快又对

选择排序不稳定举例:3313 -> 1333

快速排序不稳定举例:55553[以5为基准] -> 35555

堆排序不稳定举例:5446变成大根堆的过程 -> 6544[可以自己画图一下]

目前没有找到时间复杂度是 O(N * logN),空间复杂度是O(1),又稳定的排序。

一般我们用快排多一些,因为经过实验表明它的常数项是最低的,如果实在有空间限制就用堆排序,需要稳定性的时候使用归并排序

工程上对排序的改进

  • 充分利用O(N * logN)和O(N^2)排序的优势,整体上用快速排序,当样本量 <= 60的时候直接用插入排序了。因为在小样本情况下,N^2瓶颈不明显,反而常数项是限制,所以小样本是插入排序。
  • 稳定性,比如面试官如果问你对于普通类型用快排,自己定义的类型用归并,原因是什么,答案就是要考虑稳定性