A和B是堆栈上的相邻行,A是最底部的行和较小的行(如果B较小,则merge_hi将执行合并,但同样的问题也适用于此)。我一直在试图弄清楚为什么A的最后一个元素必须大于B的最后一个元素,因为我看不到运行分解(或算法的其余部分)如何确保该条件。另外,在同一函数中,代码似乎暗示B的第一个元素总是小于A的第一个元素,我也不知道为什么,但是我猜这个问题的答案与答案有关第一个问题。
答案 0 :(得分:0)
简而言之,疾驰是原因。这就是为什么我们最初没有看到它的原因,因为我认为gallop_
{left
} right
}仅从merge
_ {lo
,{ {1}}}。但这不是真的。也依次从hi
,{em>之前调用gallop_
... merge_at
_ {merge
,lo
}找到“ b从a哪里开始?”和“ b的结尾在哪里?”。那些调用(和后续代码) change hi
(及其长度ssb
),还有nb
及其长度ssa
,这样标题不变。
也就是说,要点是A和B不是要排序的原始列表中的“在运行堆栈上相邻运行”。在调用na
_ {merge
,lo
}之前,将它们修剪掉,以使标题中的条件成立。也就是说,在A与B合并之前,不考虑B大于A的最后一个元素的元素explicitly。换句话说,“由于合并hi
必须具有ssa.keys[na-1]
并不是因为ssa.keys[na-1]
的某些特殊属性,而是因为我们在其中定义了“合并结束”这样的方式。 :-)
这也意味着,当您自己实现Timsort时,如果您不进行讨论,则还必须忽略此处讨论的优化,否则代码将无法正常工作。