首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Shell排序中的h-排序

Shell排序中的h-排序
EN

Stack Overflow用户
提问于 2017-01-17 22:37:39
回答 2查看 1.3K关注 0票数 1

在shell排序中,建议使用3h+1序列对列表使用插入排序进行排序。

//1, 4, 13, 40, ...

计算h起始值的最佳公式是listsize的三分之一,如下所示,

代码语言:javascript
复制
int h = 1;
while(h < listSize/3){ // why N/3?

  h = 3*h + 1
}
while(h >= 1){

  //h-sort the array
  // perform insertionSort
  h = h/3;
}

问题:

要执行shell排序,如何从数学上证明h(最大值)应该小于listSize/3

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-18 01:57:30

如果在条件h之后继续增加(h < listSize/3)h就会比listSize大,而h排序没有意义--我们不能比较条目A[i]A[i+h],因为第二个索引超出了列表范围。

票数 3
EN

Stack Overflow用户

发布于 2020-12-31 14:04:12

为Shell排序推荐的最优序列称为Knuth序列,它实际上是从0开始h的3h+1,并被前面方程的解所代替。

代码语言:javascript
复制
h=0;    3*0+1=1
h=1;    3*1+1=4
h=4;    3*4+1=13
h=13;   3*13+1=40 and so on.

现在,对于Shell排序,建议您在选择最佳“间隙”时按照反向 order中的顺序进行操作。要做到这一点,您必须找到最后一个“差距”,它比listsize小。

假设您的列表大小为n=100,那么您希望空白为40,13,4,1

代码语言:javascript
复制
int gap;
for(int h=0; h<n; h=h*3+1)
    gap=h;

这会让你活到40岁现在执行插入排序,从技术上以gap=gap/3的形式得到以前的gap值,但是由于其余部分被丢弃,所以我们不担心它。

所以你得到了最后的代码,比如:

代码语言:javascript
复制
for(int h=0; h<n; h=h*3+1)
    gap=h;

while(gap>=1)
{
    //insertion sort with gap increments
    gap=gap/3;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41708290

复制
相关文章

相似问题

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