C 语言Shell 排序

来源:互联网 发布:网络情缘陈星 编辑:程序博客网 时间:2024/06/07 15:20

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我长智齿牙龈痛怎么办 出智齿引起牙龈肿痛怎么办 要长智齿牙肉痛怎么办 牙齿肿了有脓包怎么办 牙肉发炎有脓包怎么办 拔智齿伤了神经怎么办 牙下面的肉疼该怎么办 后面牙突然好疼怎么办 拔智齿后的牙洞怎么办 换牙期牙齿长歪怎么办 小孩子牙齿长歪了怎么办 换牙门牙长歪了怎么办 宝宝牙齿长歪了怎么办 小孩的牙齿长歪了怎么办 婴儿门牙长歪了怎么办 牙齿掉了好几颗怎么办 第二磨牙长歪了怎么办 第二乳磨牙坏了怎么办 小孩牙齿都坏了怎么办 第二乳磨牙蛀了怎么办 门牙烂了个洞怎么办 门牙掉了两颗怎么办 牙坏了不能补了怎么办 牙从里面坏了怎么办 百度云容量满了怎么办 mp3连接不上电脑怎么办 深户离职后社保怎么办 依云喷雾过敏了怎么办 阿里云邮箱满了怎么办 苹果手机ic坏了怎么办 王者队友不给力怎么办 协同大作战出bug怎么办 耳朵一个大一个小怎么办 58同城兼职被骗怎么办 我欠了好多钱怎么办 p2p平台跑路了怎么办 别人借钱跑路了怎么办 善心汇崩盘了钱怎么办 日本销签忘记了怎么办 手腕的筋拉伤了怎么办 膝盖韧带拉伤怎么办恢复快