C 语言Shell 排序


void shell_sort(int v[], int n)
{
    int gap, i, j, temp;
    for (gap = n/2; gap > 0; gap /= 2)
    {
        printf ("gap = %d\n", gap);
        for (i = gap; i < n; i++)
        {
            printf ("gap = %d,i = %d\n",gap, i);
            for (j = i-gap; j >= 0 ; j -= gap)
            {
                printf("gap = %d,i = %d, j = %d: v[%d] <-> v[%d]\n", gap, i, j, j, j + gap);
                if (v[j] > v[j + gap])
                {
                    temp = v[j];
                    v[j] = v[j + gap];
                    v[j + gap] = temp;
                }
            }
        }
    }
}
int main()
{
    int i;
    int v[] = {5, 10, 18, 3, 6, 12, 7, 9, 5};
    shell_sort(v, 9);
    for (i = 0; i < 9; i++)
    {
        printf (" %d ", v[i]);
    }
    return 0;

}


运行结果如下, 通过查看运行结果,是不是发现 shell 元素之间的比较有一定的规律呢?

gap = 4
gap = 4,i = 4
compare count is 1, gap = 4,i = 4, j = 0: v[0] <-> v[4]
gap = 4,i = 5
compare count is 2, gap = 4,i = 5, j = 1: v[1] <-> v[5]
gap = 4,i = 6
compare count is 3, gap = 4,i = 6, j = 2: v[2] <-> v[6]
gap = 4,i = 7
compare count is 4, gap = 4,i = 7, j = 3: v[3] <-> v[7]
gap = 4,i = 8
compare count is 5, gap = 4,i = 8, j = 4: v[4] <-> v[8]
compare count is 6, gap = 4,i = 8, j = 0: v[0] <-> v[4]
gap = 2
gap = 2,i = 2
compare count is 7, gap = 2,i = 2, j = 0: v[0] <-> v[2]
gap = 2,i = 3
compare count is 8, gap = 2,i = 3, j = 1: v[1] <-> v[3]
gap = 2,i = 4
compare count is 9, gap = 2,i = 4, j = 2: v[2] <-> v[4]
compare count is 10, gap = 2,i = 4, j = 0: v[0] <-> v[2]
gap = 2,i = 5
compare count is 11, gap = 2,i = 5, j = 3: v[3] <-> v[5]
compare count is 12, gap = 2,i = 5, j = 1: v[1] <-> v[3]
gap = 2,i = 6
compare count is 13, gap = 2,i = 6, j = 4: v[4] <-> v[6]
compare count is 14, gap = 2,i = 6, j = 2: v[2] <-> v[4]
compare count is 15, gap = 2,i = 6, j = 0: v[0] <-> v[2]
gap = 2,i = 7
compare count is 16, gap = 2,i = 7, j = 5: v[5] <-> v[7]
compare count is 17, gap = 2,i = 7, j = 3: v[3] <-> v[5]
compare count is 18, gap = 2,i = 7, j = 1: v[1] <-> v[3]
gap = 2,i = 8
compare count is 19, gap = 2,i = 8, j = 6: v[6] <-> v[8]
compare count is 20, gap = 2,i = 8, j = 4: v[4] <-> v[6]
compare count is 21, gap = 2,i = 8, j = 2: v[2] <-> v[4]
compare count is 22, gap = 2,i = 8, j = 0: v[0] <-> v[2]
gap = 1
gap = 1,i = 1
compare count is 23, gap = 1,i = 1, j = 0: v[0] <-> v[1]
gap = 1,i = 2
compare count is 24, gap = 1,i = 2, j = 1: v[1] <-> v[2]
compare count is 25, gap = 1,i = 2, j = 0: v[0] <-> v[1]
gap = 1,i = 3
compare count is 26, gap = 1,i = 3, j = 2: v[2] <-> v[3]
compare count is 27, gap = 1,i = 3, j = 1: v[1] <-> v[2]
compare count is 28, gap = 1,i = 3, j = 0: v[0] <-> v[1]
gap = 1,i = 4
compare count is 29, gap = 1,i = 4, j = 3: v[3] <-> v[4]
compare count is 30, gap = 1,i = 4, j = 2: v[2] <-> v[3]
compare count is 31, gap = 1,i = 4, j = 1: v[1] <-> v[2]
compare count is 32, gap = 1,i = 4, j = 0: v[0] <-> v[1]
gap = 1,i = 5
compare count is 33, gap = 1,i = 5, j = 4: v[4] <-> v[5]
compare count is 34, gap = 1,i = 5, j = 3: v[3] <-> v[4]
compare count is 35, gap = 1,i = 5, j = 2: v[2] <-> v[3]
compare count is 36, gap = 1,i = 5, j = 1: v[1] <-> v[2]
compare count is 37, gap = 1,i = 5, j = 0: v[0] <-> v[1]
gap = 1,i = 6
compare count is 38, gap = 1,i = 6, j = 5: v[5] <-> v[6]
compare count is 39, gap = 1,i = 6, j = 4: v[4] <-> v[5]
compare count is 40, gap = 1,i = 6, j = 3: v[3] <-> v[4]
compare count is 41, gap = 1,i = 6, j = 2: v[2] <-> v[3]
compare count is 42, gap = 1,i = 6, j = 1: v[1] <-> v[2]
compare count is 43, gap = 1,i = 6, j = 0: v[0] <-> v[1]
gap = 1,i = 7
compare count is 44, gap = 1,i = 7, j = 6: v[6] <-> v[7]
compare count is 45, gap = 1,i = 7, j = 5: v[5] <-> v[6]
compare count is 46, gap = 1,i = 7, j = 4: v[4] <-> v[5]
compare count is 47, gap = 1,i = 7, j = 3: v[3] <-> v[4]
compare count is 48, gap = 1,i = 7, j = 2: v[2] <-> v[3]
compare count is 49, gap = 1,i = 7, j = 1: v[1] <-> v[2]
compare count is 50, gap = 1,i = 7, j = 0: v[0] <-> v[1]
gap = 1,i = 8
compare count is 51, gap = 1,i = 8, j = 7: v[7] <-> v[8]
compare count is 52, gap = 1,i = 8, j = 6: v[6] <-> v[7]
compare count is 53, gap = 1,i = 8, j = 5: v[5] <-> v[6]
compare count is 54, gap = 1,i = 8, j = 4: v[4] <-> v[5]
compare count is 55, gap = 1,i = 8, j = 3: v[3] <-> v[4]
compare count is 56, gap = 1,i = 8, j = 2: v[2] <-> v[3]
compare count is 57, gap = 1,i = 8, j = 1: v[1] <-> v[2]
compare count is 58, gap = 1,i = 8, j = 0: v[0] <-> v[1]
 3  5  5  6  7  9  10  12  18

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值