在一个熟悉的问题中,数组中的每个元素距离它的正确位置最多k个位置,无论是向左还是向右,我都不完全理解插入排序算法的方式的工作原理。
我把它画在纸上,然后调试它。它确实有效,时间复杂度的顺序也是O(n.k)。
但是我的问题是,在这个问题中,元素可能在左边或右边的k个位置。但是,插入排序仅检查左侧。它如何仍然能够做到正确? 请您解释一下,这个算法是如何工作的,虽然我们只能向左看,但我能说服自己吗?
PS:这里不相关:如果我不知道这个算法,我会想到像Selection sort这样的东西,对于给定的元素,我,你看,左侧和右侧的k个位置,以选择最小的元素。
PS:更加无关紧要:我知道基于min-heap的方法。同样,同样的问题,为什么我们只向左看呢?
答案 0 :(得分:2)
当算法处理较小的项目时,正确位置左侧的项目被向右推。 (假设我们按升序排序。)例如,如果k
为3且初始数组为
D A B E H C F G
让我们来看看D
如何到达数组中的位置3。 (使用从零开始的索引,D从索引0开始,需要移动到数组中的索引3.)
第一遍从E开始,发现它可以交换A和D,结果是
A D B E H C F G
第二遍从H开始,交换B和D
A B D E H C F G
第三遍从C开始,并用H,E和D交换C
A B C D E H F G
现在你看到D已经到了应有的位置。
情况总是如此。当处理较小的元素时,任何从其最终位置左侧开始的元素将被向右推(到其最终位置)。否则,较小的元素不在的正确位置。并且元素(如D)不会被推过它的正确位置,因为算法不会将该元素与更大的元素交换。
答案 1 :(得分:0)
在插入中排序实际发生的是 将元素与左侧的每个元素进行比较 。那么会发生什么呢?该元素左侧的 列表被排序,该元素右侧的列表不是 。然后我们继续下一个元素并再次重复相同的过程。这样做直到我们到达列表中的最后一个元素。因此我们得到排序列表。
答案 2 :(得分:0)
这是一个错误的假设,你只需要向左看。您也可以从开头索引开始,然后向右看。
但是,有一种叫做 Loop Invariant 的东西(详细了解一下)。插入排序的不变量是它将一个排序的子数组(在算法运行时增长)保持在其左侧或右侧。
这里是读取的链接,它将清除它。 https://www.hackerrank.com/challenges/correctness-invariant