插入排序是否始终在排序列表中使用N-1个同盟?

时间:2012-09-30 21:40:50

标签: sorting insertion-sort

我刚刚完成了旧的“Sorting Detective”作业(你会得到一些黑盒子排序算法,并且必须根据结果确定每个人的例子),我注意到插入排序总是进行N-1比较在排序列表上。因为在每个人都完成作业之前我都无法查看我的教师代码,也不允许我在课堂上提出可以向其他学生提示如何解决问题的问题,这让我失望有问题我至少一个星期都无法得到这个问题的答案。

在现实世界中,插入排序的教科书示例是否会在排序列表上进行N-1比较,或者是我的教师/教科书的插入排序版本的怪癖,总是如此?

在搜索谷歌和维基百科后,我找不到答案,这意味着我要么提出错误的问题,要么就是没有问题。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

是的,如果输入已经排序,“教科书”插入排序将执行N-1比较。参见Knuth的计算机编程艺术,第3卷,§5.2.1,算法S(直插式排序)。对于每个记录R i (i> 1),算法将其与元素R i-1 下降到R 1 ,其中order,直到找到小于R i 的元素。如果输入已经排序,则R i-1 总是小于R i ,因此算法仅对每个记录执行一次比较(并且没有记录1的比较)

当然,您可以编写插入排序以按照从R 1 到R i-1 的顺序执行比较,但是这将执行N *(N- 1)/ 2比较输入列表是否已经排序。所以不要这样做。 :)

您还可以使用二进制搜索来查找插入每条记录的位置。这称为二进制插入,Knuth也在§5.2.1中对其进行了讨论。同样,它将对已经排序的输入执行比教科书直接插入更多的比较(但随机输入更少)。