前言
此为知乎之前文章的重置版,整理和消除了部分错误,适合收藏用。
本文总结了常用的全部排序算法,内容包括:
排序算法的定义和思路,动画演示排序算法的代码实现:Python和Java,包括实现中需要注意的细节排序算法性能分析:时间空间复杂度分析,稳定排序算法背诵口诀等不同排序算法最佳使用场景
此文干货颇多,烦请收藏后慢慢研读。
面试知识点复习手册
此文属于知识点复习手册专栏内容,你还可以通过以下两种途径查看全复习手册文章导航:
关注我的公众号:Rude3Knife 点击公众号下方:技术推文——面试冲刺
-----正文开始-----
算法性能分析
图中纠正:归并排序空间复杂度应该是O(n),快排是O(logn)-O(n)
稳定性定义:
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
例如,对于如下冒泡排序算法,原本是稳定的排序算法,如果将记录交换的条件改成r[j]>=r[j+1],则两个相等的记录就会交换位置,从而变成不稳定的算法。
再如,快速排序原本是不稳定的排序方法,但若待排序记录中只有一组具有相同关键码的记录,而选择的轴值恰好是这组相同关键码中的一个,此时的快速排序就是稳定的。
只需记住一句话(快些选一堆美女一起玩儿)是不稳定的,其他都是稳定的。
补充性能图:
不同情况下的合适排序方法
初始数据越无序,快速排序越好。
已经基本有序时,用直接插入排序最快。
在随机情况下,快速排序是最佳选择。
既要节省空间,又要有较快的排序速度,堆排序是最佳选择,其不足之处是建堆时需要消耗较多时间。
若希望排序是稳定的,且有较快的排序速度,则可选用2路归并排序,其缺点需要较大的辅助空间分配。
算法实现
基于比较的排序算法
冒泡排序
思路:
冒泡排序的原理非常简单,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
步骤:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。