有人可以提供Java中使用Knuth序列的shellort的简单工作示例吗?我通过互联网查看了几个地方,但无法找到适合我的解释。我从概念层面理解了弹壳 - 因为它是一个插入排序,它是在一个间隙上完成的,该间隙会随着时间的推移而缩小,直到达到1的间隙 - 这实际上是一种插入排序。然而,Knuth序列是(k * 3 - 1)/ 2,前几个间隙的列表通常表示为[1,4,13,40,71 ......等等]。
我的问题是如何实施?起始间隙实际上是1,还是这个序列在它大于被排序列表大小之前生成的值?如果差距从1开始,如果我正确理解shell排序,那么目的就会失败。有人可能会对此有所了解吗?我觉得我错过了理解这件事的重要事情。
提前致谢。
答案 0 :(得分:1)
最新答案,但是对于任何将来的旁观者而言,他们都懒于跟踪其他答案中的链接,或者链接断开了...
这是一种实现Knuth算法的方法,可以按降序查找初始间隙值以及其余间隙值:
// Find initial gap.
gap = 1;
while gap < arrayLength {
gap = gap * 3 + 1;
}
// Perform the main sorting logic...
// Somewhere within code, at the end
// of the main sorting logic, find next
// descending gap value.
gap /= 3;
起始间隔不是1。它是在遍历要排序的数组的长度之前计算出的最后一个最高数字。
底部的三分除法基本上与在while循环中执行的计算相反,以便按降序获得序列中的下一个间隙值。每次在主排序逻辑的末尾都完成此操作。
此外,公式实际上是(3 ^ k-1)/ 2而不是(3k-1)/2。前者将得出正确的顺序(1、4、13、40,...)和后者是不正确的。
答案 1 :(得分:0)
我在http://algs4.cs.princeton.edu/找到了一个(参见“基本排序”一章)。 源代码可以找到here
Shell类提供了用于排序的静态方法 使用Shellsort和Knuth的增量序列(1,4,13,40,...)的数组。 有关其他文档,请参阅Robert Sedgewick和Kevin Wayne撰写的“算法,第4版”的“http://algs4.cs.princeton.edu/21elementary”(第2.1节)。