Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 插入排序是否总是在已排序的列表上使用N-1个比较项?_Sorting_Insertion Sort - Fatal编程技术网

Sorting 插入排序是否总是在已排序的列表上使用N-1个比较项?

Sorting 插入排序是否总是在已排序的列表上使用N-1个比较项?,sorting,insertion-sort,Sorting,Insertion Sort,我刚刚完成了旧的“排序侦探”作业(这里给了你一些黑盒排序算法,你必须根据结果确定每个算法是什么样的),我注意到插入排序总是在排序列表上进行N-1比较。因为在每个人都交上作业之前,我无法查看老师的代码,也不允许我在课堂上提出可能会提示其他学生如何继续解决问题的问题,这给我留下了一个问题,我至少一周都无法得到这个问题的答案 在现实世界中,插入排序的教科书示例总是会在排序列表上进行N-1比较,还是我的讲师/教科书版本的插入排序有点奇怪 在搜索了谷歌和维基百科之后,我找不到这个问题的答案,这意味着要么我

我刚刚完成了旧的“排序侦探”作业(这里给了你一些黑盒排序算法,你必须根据结果确定每个算法是什么样的),我注意到插入排序总是在排序列表上进行N-1比较。因为在每个人都交上作业之前,我无法查看老师的代码,也不允许我在课堂上提出可能会提示其他学生如何继续解决问题的问题,这给我留下了一个问题,我至少一周都无法得到这个问题的答案

在现实世界中,插入排序的教科书示例总是会在排序列表上进行N-1比较,还是我的讲师/教科书版本的插入排序有点奇怪


在搜索了谷歌和维基百科之后,我找不到这个问题的答案,这意味着要么我问错了问题,要么他们根本没有。有什么想法吗?

是的,如果输入已经排序,“教科书”插入排序将执行N-1比较。例如,参见Knuth的《计算机编程的艺术》,第3卷,§5.2.1,算法s(直接插入排序)。对于每个记录Ri(i>1),算法将其与元素Ri-1进行比较,直到找到一个小于Ri的元素。如果输入已经排序,则Ri-1总是小于Ri,因此算法只对每个记录执行一次比较(而不对记录1执行比较)

当然,您可以编写插入排序来执行从R1到Ri-1的比较,但是如果输入列表已经排序,则将执行N*(N-1)/2比较。所以不要这样做。:)


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

要在有序列表(大小N)上找到“插入点”,需要进行日志(N)比较。要插入一个项目,您应该首先搜索(登录N),然后插入/“上移”(N/2)移动:=N。谢谢!这正是我想知道的。我特别高兴,因为我的导师现在正在出差,所以我再过一周也得不到答案了。