x300A中的for(h=1;h<;=(r-1)/9;h=h*3+;1)循环意味着什么;C语言中的算法第1-4部分&x300B;p172贝壳分类?

x300A中的for(h=1;h<;=(r-1)/9;h=h*3+;1)循环意味着什么;C语言中的算法第1-4部分&x300B;p172贝壳分类?,c,algorithm,sorting,shellsort,C,Algorithm,Sorting,Shellsort,我在研究第172页Sedgewick的贝壳种类 我使用size(数组长度),而不是l和r(开始和结束); 所以我的代码是 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];

我在研究第172页Sedgewick的贝壳种类

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

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;
    }
}
inti,j,h;
int键;
对于(h=1;h0;h/=3)
{
对于(i=h;i=h&&key>num[j-h];j-=h)
{
num[j]=num[j-h];
} 
num[j]=键;
}
}
这些我都知道。我读书。我知道1、4、13……是最好的序列(可比)。 但在这个位置上,我的代码

for(h=1;h<size;h=h*3+1);
用于(h=1;h循环:

for (h = 1; h < size; h = h * 3 + 1)
    ;

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

我认为外循环可能与shell排序增量序列有关。如果您尚未这样做,我建议阅读。
/9
表示“除以九”.非常感谢><我明白了。我还可以为(h=1;(h*3+1)写作
#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;
}
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