说明:本博客适合复习《数据结构》时阅读。

排序算法的分类

比较类,非比较类
常用排序算法小结

常用排序算法复杂度及稳定性

常用排序算法小结

时间性能

平均的时间性能

时间复杂度为 O(nlogn) :快速排序、堆排序和归并排序
时间复杂度为 O(n^2 ) :直接插入、冒泡和简单选择排序
时间复杂度为 O(n) : 基数排序

当待排记录序列按关键字顺序有序时

直接插入和冒泡排序:O(n)
快速排序:O(n^2) 。

简单选择排序、堆排序和归并排序的时间性能不随记录序列中关键字的分布而改变 。

空间性能

所有的简单排序方法(直接插入、起泡和简单选择) 和堆排序的空间复杂度为 O(1) ;
快速排序为 O(logn),为递归程序执行过程中,栈所需的辅助空间 ;
归并排序所需辅助空间最多,其空间复杂度为O(n);
链式基数排序需附设队列首尾指针 , 则空间复杂度为 O(rd) 。

算法特点

插入排序

包括直接插入排序 , 二分插入排序 ,希尔排序

直接插入排序:对于有 n 个数据元素的待排序序列,n - 1 次数据比较 ,最好情况 0 次数据移动 (待排序的数据已经有序)。
注意:当n<16 时 , 直接插入比 O(nlogn) 的排序方法快。

二分插入排序: 用二分查找方法找出应该插入的位置; 二分插入排序减少了关键字的比较次数 ,但数据元素的移动次数不变 , 其时间复杂度与直接插入排序相同。

希尔排序:设定增量作为距离,按照相同距离分组,对每组进行插入排序。减小增量,重复上述步骤。
综上,插入排序对基本已经排好序的列表有较好的时间复杂度。

交换排序:

包括冒泡排序 , 快速排序。

快速排序:顾名思义。
基准元素的选取:快排不稳定,贸然选择数组第一个元素可能导致最坏结果(如果排序记录基本有序,选择的元素恰为最小元素,时间复杂度o(n^2))。因此可以选择第一个数据元素、最后一个数据元素、中间位置的数据元素的中位数

选择排序

包括简单选择排序,堆排序。

简单选择排序:适用于待排序元素较少的情况。
堆排序:大顶堆和小顶堆,本身是一棵完全二叉树。
ps:堆排序涉及到了树的相关知识,比较难理解,附上某位前辈的链接:友情链接

归并排序

多为二路归并排序。
二路归并排序: 分而治之,一趟归并的时间复杂度为 O(n), 总共需进行 log2n 趟。

基数排序

包括计数排序,桶排序,基数排序,是根据关键字本身的性质进行排序,不通过待排序数据元素之间的比较。

桶排序:每个数据元素关键字的值将其分配到相应的桶中,要求关键字的取值范围已知。

基数排序:“ 分配 ” 时,按当前“关键字位”所取值,将记录分配到不同的“桶”中,每个队列“桶”中记录的 “关键字位” 相同;“ 收集 ”时,按当前关键字位取值从小到大将各“桶”首尾相链成一个链表。对每个关键字位均重复上两步。
“ 分配 ”和“ 收集 ”的实际操作仅为修改链表中的指针和设置队列的头、尾指针;

相关文章: