首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中为shellsort排序正确实现Knuth序列?

如何在Java中为shellsort排序正确实现Knuth序列?
EN

Stack Overflow用户
提问于 2015-10-26 14:44:01
回答 2查看 7.7K关注 0票数 5

有没有人能提供一个简单的使用Knuth序列的Java外壳排序的工作示例?我在互联网上找了好几个地方,但都找不到一个适合我的解释。我在概念层面上理解外壳排序-因为它是一种插入排序,它是在一个随着时间的推移而缩小的间隔上完成的,直到达到1的间隔-这实际上是一种插入排序。然而,Knuth序列是(k *3- 1)/2,并且前几个间隙的列表通常表示为1,4,13,40,121。诸若此类。

我的问题是,这将如何实现?起始间隔实际上是1,还是这个序列在它大于正在排序的列表的大小之前生成的值?如果差距从1开始,如果我对shell排序的理解是正确的,那么目的就会失效。有没有人能解释一下这个?我觉得我错过了一些对理解这件事至关重要的东西。

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2019-07-15 09:26:07

延迟回答,但对于任何未来的旁观者太懒而不愿关注其他答案的链接,或者如果链接断开……

这是一种实现Knuth算法的方法,以按降序查找初始间隙值和剩余间隙值:

代码语言:javascript
复制
// 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。它是在遍历要排序的数组的长度之前计算的最后一个最高数字。

底部的除以3部分基本上与while循环中执行的计算顺序相反,以便以降序获得序列中的下一个间隔值。这是每次在主排序逻辑结束时完成的。

另外,公式实际上是(3^k - 1) / 2,而不是(3k - 1) /2。前者将产生正确的序列(1,4,13,40,...)而后者是不正确的。

票数 5
EN

Stack Overflow用户

发布于 2015-10-26 14:59:59

我在http://algs4.cs.princeton.edu/上找到了一个(参见“基本排序”一章)。源代码可以在here上找到

Shellsort类提供了使用

和Knuth的递增序列(1,4,13,40,...)对数组进行排序的静态方法。有关其他文档,请参阅Robert Sedgewick和Kevin Wayne的“算法,第四版”的"http://algs4.cs.princeton.edu/21elementary“(第2.1节)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33339851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档