【软考】希尔排序算法分析

目录

          • 1. c代码
          • 2. 运行截图
          • 3. 运行解析

1. c代码
#include 
#include  

void shellSort(int data[], int n){
    // 划分的数组,例如8个数则为[4, 2, 1]
    int *delta;
    int k;
    // i控制delta的轮次
    int i;
    // 临时变量,换值
    int temp;
    int dk;
    int j;

    k = n;
    delta = (int *)malloc(sizeof(int)*(n/2));
    i = 0;
    do{
        // 不断除以2
        k = k / 2;
        delta[i] = k;
        printf("%d ", delta[i]);
        i++;
    }while(k > 1);
    printf("\n");
    
    i = 0;
    dk = delta[i];
    while(dk > 0){
        for(k = delta[i]; k < n; ++k){
            // data[k-dk]是靠前的数,data[k]是靠后的数
            if(data[k] < data[k-dk]){
                // 用临时变量temp暂存小的数
                temp = data[k];
                // 
                for(j = k - dk; j >= 0 && temp < data[j]; j -= dk){
                    data[j+dk] = data[j];
                }
                data[j+dk] = temp;
            }
            // 打印
            printf("排序后的数组: ");
            for (int a = 0; a < n; a++) {
                printf("%d ", data[a]);
            }
            printf("\n");
        }
        ++i;
        dk = delta[i];
    }
}



int main(int argc, char const *argv[]){
    int data[10] = {48, 37, 64, 96, 75, 12, 26, 48, 54, 3};
    // 数组长度
    int n = sizeof(data) / sizeof(data[0]);

    shellSort(data, n);
    // 打印
    printf("排序后的数组: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", data[i]);
    }

    return 0;
}


2. 运行截图

【软考】希尔排序算法分析_第1张图片

3. 运行解析
1.从main方法开始
2.待排序数组为: {48, 37, 64, 96, 75, 12, 26, 48, 54, 03}
3.数组长度:int n = sizeof(data) / sizeof(data[0]) = 10/1=10
4.执行shellSort(data, n)
5.k=n=10, i=0
6.delta[0]=10/2=5
7.delta[1]=5/2=2
8.delta[2]=2/2=1
9.dk=delta[i]=delta[0]=5
10.此时dk>0成立,进入while循环

11.k=delta[0]=5
12.k=0成立
19.data[j]即data[0]=48
20.temp=0即-5>=0不成立,跳出第二个for循环
24.data[j+dk]=temp即data[-5+5]=data[0]=12
25.此时data[0]=12,data[5]=48,数组为:{12, 37, 64, 96, 75, 48, 26, 48, 54, 03}
26.k=k+1=5+1=6

27.k=0成立
34.data[j]=data[1]=37
35.temp=0即-4>=0不成立,跳出第二个for循环
39.data[j+dk]=temp即data[-4+5]=data[1]=26
40.此时data[1]=26,data[6]=37,数组为:{12, 26, 64, 96, 75, 48, 37, 48, 54, 03}
41.k=k+1=6+1=7

42.k=0成立
49.data[j]=data[2]=64
50.temp=0即-3>=0不成立,跳出第二个for循环
54.data[j+dk]=temp即data[-3+5]=data[2]=48
55.此时data[2]=48,data[7]=64,数组为:{12, 26, 48, 96, 75, 48, 37, 64, 54, 03}
56.k=k+1=7+1=8

57.k=0成立
64.data[j]=data[3]=96
65.temp=0即-2>=0不成立,跳出第二个for循环
69.data[j+dk]=temp即data[-2+5]=data[3]=54
70.此时data[3]=54,data[8]=96,数组为:{12, 26, 48, 54, 75, 48, 37, 64, 96, 03}
71.k=k+1=8+1=9

72.k=0成立
79.data[j]=data[4]=75
80.temp=0即-1>=0不成立,跳出第二个for循环
84.data[j+dk]=temp即data[-1+5]=data[4]=3
85.此时data[4]=3,data[9]=75,数组为:{12, 26, 48, 54, 03, 48, 37, 64, 96, 75}
86.k=k+1=9+1=10

87.k0成立,接着while循环
91.k=delta[1]=2

92.k=0成立
109.data[j]=data[2]=48
110.temp=0成立
114.data[j]=data[0]=12
115.temp=0即-2>=0不成立,跳出第二个for循环
119.data[j+dk]=temp即data[-2+2]=data[0]=3
120.此时data[4]=48,data[2]=12,data[0]=3,数组为:{03, 26, 12, 54, 48, 48, 37, 64, 96, 75}
121.k=k+1=4+1=5

122.k=0成立
129.data[j]=data[3]=54
130.temp=0成立
134.data[j]=data[1]=26
135.temp=0成立
129.data[j]=data[4]=48
130.temp=0成立
134.data[j]=data[2]=12
135.temp=0成立
170.data[j]=data[1]=26
171.temp=0成立
175.data[j]=data[0]=3
176.temp=0成立
189.data[j]=data[3]=54
190.temp=0成立
194.data[j]=data[2]=26
195.temp=0成立
206.data[j]=data[4]=54
207.temp=0成立
211.data[j]=data[3]=48
212.temp

你可能感兴趣的:(软考,算法,算法,软考)