【问题标题】:k messed sorted array using Insertion sortk 使用插入排序的混乱排序数组
【发布时间】:2016-11-06 18:07:38
【问题描述】:

在熟悉的问题中,数组中的每个元素最多离它的正确位置有 k 个位置,无论是向左还是向右,我并不完全理解插入排序算法的工作原理。

我把它画在纸上,然后一步一步调试。它似乎确实有效,时间复杂度的顺序也是 O(n.k)。

但我的问题是,在这个问题中,元素可能在左侧或右侧有 k 个位置。但是,插入排序只检查左边。它如何仍然能够做到正确? 您能否向我解释一下,尽管我们只向左看,但这种算法仍然有效吗?以我可以说服自己的方式?

PS:这里无关:如果我不知道这个算法,我会想到选择排序之类的东西,对于给定的元素 i,你在左右,选择最小的元素。

PS:更无关紧要:我知道基于最小堆的方法。同样的问题,为什么我们只看左边?

【问题讨论】:

    标签: arrays algorithm sorting insertion-sort in-place


    【解决方案1】:

    当算法处理较小的项目时,正确位置左侧的项目会被向右推。 (假设我们按升序排序。)例如,如果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 开始,将 C 与 H、E 和 D 交换

    A B C D E H F G
    

    现在你看到 D 已经在它应该在的地方了。

    情况总是如此。在处理较小的元素时,任何从其最终位置左侧开始的元素都将被向右推(到其最终位置)。否则,较小的元素不在它们的正确位置。并且元素(如 D)不会被推过它的正确位置,因为算法不会将该元素与更大的元素交换。

    【讨论】:

    • 谢谢。我认为单行代码是,“如果元素 a[i] 的正确位置实际上最多在右侧 k 个位置,那么 a[i+k] 的正确位置最多为 k位置在左边。所以 a[i] 将在第 (i+k) 次迭代中得到修复。
    • @user121 是的,总是很难知道什么级别的抽象会被理解,所以我倾向于过度简化。
    【解决方案2】:

    在插入排序中,实际发生的是我们将一个元素与其左侧的每个元素进行比较。因此,发生的情况是该元素左侧的 列表已排序,而该元素右侧的列表未排序。然后我们继续下一个元素并再次重复相同的过程。这样做直到我们到达列表中的最后一个元素。因此我们得到了排序列表。

    【讨论】:

      【解决方案3】:

      您只需要向左看的假设是错误的。也可以从开始索引开始往右看。

      但是,有一种叫做循环不变量(阅读更多)。插入排序的不变性在于它在它的左边或右边保持一个排序的子数组(随着算法的运行而增长)。

      这是一个阅读的链接,它将清除它。 https://www.hackerrank.com/challenges/correctness-invariant

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-08
        • 1970-01-01
        • 1970-01-01
        • 2021-02-03
        • 2016-05-05
        • 2019-06-30
        相关资源
        最近更新 更多