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. 运行截图
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