首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >for(h=1;h<=(r-1)/9;h=h*3+1)循环在“C 1-4中的算法”p172 shellSort中意味着什么?

for(h=1;h<=(r-1)/9;h=h*3+1)循环在“C 1-4中的算法”p172 shellSort中意味着什么?
EN

Stack Overflow用户
提问于 2015-01-13 02:24:47
回答 1查看 157关注 0票数 0

我正在研究Sedgewick C部分第1-4部分的算法 on p172中的Shell类型。

我使用size (数组的长度),而不是lr (开始和结束);所以我的代码是

代码语言:javascript
复制
int i,j,h;
int key;
for( h=1;h<=(size-1)/9;h=h*3+1);
for(;h>0;h/=3)
{
    for(i=h;i<size;i++)
    {
        key=num[i];
        j=i;
        while(j>=h&&key>num[j-h];j-=h)
        {
            num[j]=num[j-h];
        } 
        num[j]=key;
    }
}

这一切我都知道。我读过TAOCP。我知道1,4,13,…是最好的序列(可比)。但在这个位置上,我的代码

代码语言:javascript
复制
for(h=1;h<size;h=h*3+1);

我的问题是:他为什么写h<(size-1)/9

/9”是什么意思?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-13 03:26:46

循环:

代码语言:javascript
复制
for (h = 1; h < size; h = h * 3 + 1)
    ;

大多数情况下会超调数组的大小。可选回路使间隙保持在范围内。

您可以通过这样一个琐碎的测试程序看到这一点:

代码语言:javascript
复制
#include <stdio.h>

static inline int hs_gap9(int size)
{
    int h;
    for (h = 1; h <= (size - 1) / 9; h = h * 3 + 1)
        ;
    return h;
}

static inline int hs_gap3(int size)
{
    int h;
    for (h = 1; h < size; h = h * 3 + 1)
        ;
    return h;
}

int main(void)
{
    for (int i = 1; i < 100; i++)
        printf("Size: %3d; gap9 = %d; gap3 = %d\n", i, hs_gap9(i), hs_gap3(i));
    return 0;
}

样本输出:

代码语言:javascript
复制
Size:   1; gap9 =   1; gap3 =   1
Size:   2; gap9 =   1; gap3 =   4
Size:   3; gap9 =   1; gap3 =   4
Size:   4; gap9 =   1; gap3 =   4
Size:   5; gap9 =   1; gap3 =  13
Size:   6; gap9 =   1; gap3 =  13
Size:   7; gap9 =   1; gap3 =  13
Size:   8; gap9 =   1; gap3 =  13
Size:   9; gap9 =   1; gap3 =  13
Size:  10; gap9 =   4; gap3 =  13
Size:  11; gap9 =   4; gap3 =  13
Size:  12; gap9 =   4; gap3 =  13
Size:  13; gap9 =   4; gap3 =  13
Size:  14; gap9 =   4; gap3 =  40
Size:  15; gap9 =   4; gap3 =  40
Size:  16; gap9 =   4; gap3 =  40
…
Size:  34; gap9 =   4; gap3 =  40
Size:  35; gap9 =   4; gap3 =  40
Size:  36; gap9 =   4; gap3 =  40
Size:  37; gap9 =  13; gap3 =  40
Size:  38; gap9 =  13; gap3 =  40
Size:  39; gap9 =  13; gap3 =  40
Size:  40; gap9 =  13; gap3 =  40
Size:  41; gap9 =  13; gap3 = 121
Size:  42; gap9 =  13; gap3 = 121
Size:  43; gap9 =  13; gap3 = 121
…
Size:  97; gap9 =  13; gap3 = 121
Size:  98; gap9 =  13; gap3 = 121
Size:  99; gap9 =  13; gap3 = 121

如您所见,“gap3”算法返回一个比数组大小更大的h初始值。“gap9”算法返回小于数组大小的h初始值。这在循环上节省了一些开销(保存外部循环的一次迭代,中间循环在第一个循环中退出,而不接触内循环。

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

https://stackoverflow.com/questions/27914025

复制
相关文章

相似问题

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