1.元素比较次数与元素的初始排列无关只有:
选择排序
2.
平均情况 | 最好情况 | 最坏情况 | |
冒泡排序 | O(n^2) | O(n) | O(n^2) |
选择排序 | O(n^2) | O(n^2) | O(n^2) |
插入排序 | O(n^2) | O(n) | O(n^2) |
希尔排序 | O(n^1.3) | O(n) | O(n^2) |
3.
平均情况 | 最好情况 | 最坏情况 | |
快速排序 | O() | O() | O(n^2) |
归并排序 | O() | O() | O() |
堆排序 | O() | O() | O() |
4.在文件"局部有序"或文件长度较小的情况下,最佳内部排序的方法是:
直接插入排序
(插入排序开始元素如果小则交换,如果不小则不此趟循环结束)
5.在待排序的数据表已经为有序时,花费时间反而最多的是:
快速排序
6.排序算法稳定性
(1)冒泡排序
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无 聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改 变,所以冒泡排序是一种稳定排序算法。
(2)选择排序
开始元素与之后的元素有相同时,而相同元素之后有最小元素,则交换最小元素与开始元素的位置!
(3)插入排序
开始元素一个一个的和前面的已经有序的小序列元素比较,所以不会插入跟它相等元素之前!
(4)快速排序
当记录大元素的下标所指小于切分元素时并且这个元素前面也是相同元素时,而记录小元素的下标所指元素大于切分元素,交换这两个元素,则相同元素次序颠倒!
(5)归并排序
归并排序是把序列递归地分成短序列,递归出口是短序列只有1个元素(认为直接有序)或者2个序列(1次比较和交换),然后把各个有序的段序列合并成一个有序的长序列,不断合并直到原序列全部排好序。可以发现,在1个或2个元素时,1个元素不会交换,2个元素如果大小相等也没有人故意交换,这不会破坏稳定性。那么,在短的有序序列合并的过程中,稳定是否受到破坏?没有,合并过程中我们可以保证如果两个当前元素相等时,我们把处在前面的序列的元素保存在结果序列的前面,这样就保证了稳定性。所以,归并排序也是稳定的排序算法。
(6)基数排序
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优 先级排序,最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以其是稳定的排序算法。
(7)希尔排序(shell)
希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小, 插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些。由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。
(8)堆排序
我们知道堆的结构是节点i的孩子为2*i和2*i+1节点,大顶堆要求父节点大于等于其2个子节点,小顶堆要求父节点小于等于其2个子节点。在一个长为n 的序列,堆排序的过程是从第n/2(一开始的序列看成是存放的完全二叉树,n/2是最后一个节点的父节点)开始和其子节点共3个值选择最大(大顶堆)或者最小(小顶堆),这3个元素之间的选择当然不会破坏稳定性。但当为n /2-1, n/2-2, ...1这些个父节点选择元素时,就会破坏稳定性。有可能第n/2个父节点交换把后面一个元素交换过去了,而第n/2-1个父节点把后面一个相同的元素没 有交换,那么这2个相同的元素之间的稳定性就被破坏了。所以,堆排序不是稳定的排序算法。