前面已经把基本的内部排序分别介绍了下,现在总结一下各种排序方便在笔试的时候能做出正确的答案。排序刚开始的时候都是简单排序:冒泡排序、直接插入排序、简单选择排序。随后开始了对前面3种简单排序的改进分别对应的是快速排序、希尔排序、堆排序。改进的地方是:冒泡排序是交换类排序最初的原型,他的思想是从两两比较相邻的关键字若是逆序则交换。思路比较直接,每一趟就可以找到一个最大的元素缺点在于交换的次数实在太多。快速排序的改进则是比较的不再是相邻的元素而是一个key,并且采用分治的策略。简单选择排序也感觉是对冒泡排序的改进,冒泡排序的缺点在于频繁的交换,按照《大话数据结构》里的比喻是冒泡排序好比炒股时的短期持有,频繁的买入卖出的手续费以及印花税导致了即使不出错也很难有很大的盈利。比较有经验的会看准时机果断买入卖出。这种比喻是表明简单选择排序的特点是每趟排序仅仅只是做一次交换。但是它的缺点在于每一趟排序都没有记忆前一趟排序的结果,于是后面的排序要做一些前面已经做过的比较。堆排序是对简单选择排序的改进,它采用的方法就是将序列建成一个堆(实际上可能不一定是这种结构,是用下标模拟的)用于记录关键字之间的相对关系。直接插入排序的想法是将序列分为有序序列和无序序列,初始化时有序序列为第一个元素,从无序序列中选择第一个元素插入到有序序列中直到无序序列为空。希尔排序是对直接插入排序的改进,改进的依据是在关键字数量较小或者基本有序时直接插入排序的效率非常高,因此希尔排序的思想就是构造这两个条件:关键字数量小可以想到用分组的策略这样就会把关键字的数量成倍的缩小,基本有序采用的方法是让分组不断减小当小到一定程度(这里一般分组为1时)时便可以达到,然后进行直接插入排序就可以了。若是关键字较少简单排序要优于改进排序,原因在于改进排序用了很多时间和空间来转化问题。具体的分类记忆表格:
排序种类 | 简单排序 | 改进排序 |
交换排序 | 冒泡排序 | 快速排序 |
插入排序 | 直接插入排序 | 希尔排序 |
选择排序 | 简单选择排序 | 堆排序 |
所有排序的时间复杂度和空间复杂度、稳定性
排序法 | 最好时间复杂度 | 最坏时间复杂度 | 平均时间复杂度 | 稳定性 |
冒泡排序 | O(n) | O(n^2) | O(n^2) | 稳定 |
直接插入排序 | O(n) | O(n^2) | O(n^2) | 稳定 |
简单选择排序 | O(n^2) | O(n^2) | O(n^2) | 稳定 |
快速排序 | O(n*logn) | O(n^2) | O(n*logn) | 不稳定 |
希尔排序 | O(n^1.3) | O(n^2) | O(n*logn~n^2) | 不稳定 |
堆排序 | O(n*logn) | O(n*logn) | O(n*logn) | 不稳定 |