Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
Arrays 使用插入排序的k混乱排序数组_Arrays_Algorithm_Sorting_Insertion Sort_In Place - Fatal编程技术网

Arrays 使用插入排序的k混乱排序数组

Arrays 使用插入排序的k混乱排序数组,arrays,algorithm,sorting,insertion-sort,in-place,Arrays,Algorithm,Sorting,Insertion Sort,In Place,在一个熟悉的问题中,数组中的每个元素最多离其正确位置k个位置,无论是向左还是向右,我不完全理解插入排序算法是如何工作的 我把它画在纸上,一步一步地调试。它似乎确实有效,时间复杂度的顺序也是O(n.k) 但我的问题是,在这个问题中,元素可以是k个位置,在左边或右边。但是,插入排序只检查左。它是如何做到正确的呢请您向我解释一下,尽管我们只看左边,但这个算法是如何工作的,我可以说服自己吗? PS:这里不相关:如果我不知道这个算法,我会想到类似选择排序的东西,对于给定的元素,我,你看左右的k个位置,选择

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

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

但我的问题是,在这个问题中,元素可以是k个位置,在左边或右边。但是,插入排序只检查左。它是如何做到正确的呢请您向我解释一下,尽管我们只看左边,但这个算法是如何工作的,我可以说服自己吗?

PS:这里不相关:如果我不知道这个算法,我会想到类似选择排序的东西,对于给定的元素,我,你看左右的k个位置,选择最小的元素


PS:更不相干的是:我知道这是一种基于最小堆的方法。同样的问题,为什么我们只看左边?

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

认为只需向左看是错误的。您也可以从开始索引开始并向右看

但是,有一种称为循环不变量的东西(请阅读更多)。插入排序的不变量是它将一个已排序的子数组(随着算法的运行而增长)保持在其左侧或右侧


这是一个链接,它可以帮助你清除这些信息

当算法处理较小的项目时,正确位置左侧的项目被向右推送。(假设我们按升序排序。)例如,如果
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)不会被推过它的正确位置,因为算法不会将该元素与较大的元素交换

谢谢。我认为这是一条直线,如果元素a[I]的正确位置实际上在右边最多k个位置,那么a[I+k]的正确位置在左边最多k个位置,那么a[I]将固定在(I+k)中第次迭代。@user121是的,总是很难知道什么级别的抽象会被理解,所以我倾向于过于简单化。