#include <stdio.h>
#include <stdlib.h>
void print(int a[], int n)
{
for (int i = 0; i < n; i++)
printf("%d,", a[i]);
printf("\n");
}
void Shell_sort(int a[], int n)
{
int i, j, Increment;
int temp;
for (Increment = n / 2; Increment > 0; Increment /= 2)
{
for (i = Increment; i < n; i++)
{
temp = a[i];
for (j = i; j >= Increment; j -= Increment)
{
if (temp > a[j - Increment])
a[j] = a[j - Increment];
else
break;
}
a[j] = temp;
}
print(a,n);
}
}
int main()
{
int n, data;
scanf("%d", &n);
int a[n];
for (int i = 0; i < n; i++)
{
scanf("%d,", &a[i]);
}
Shell_sort(a,n);
return 0;
}
便于调试版
#include <stdio.h>
#include <stdlib.h>
void print(int a[], int n)
{
for (int i = 0; i < n; i++)
printf("%d,", a[i]);
printf("\n");
}
void Shell_sort(int a[], int n)
{
int increment;
int i = 0, j = 0, temp;
for (increment = n / 2; increment > 0; increment /= 2)//确定步长,每次确定好步长后,相当于把从temp开始向前数出的间隔步长的数列抽出来。进行插入排序
{
for (i = increment; i < n; i++)
{
temp = a[i];
for (j = i; j >= increment && temp < a[j - increment]; j -= increment)
{
a[j] = a[j - increment];
}
a[j] = temp;
print(a,n);
}
}
}
int main()
{
int n, data;
scanf("%d", &n);
int a[n];
for (int i = 0; i < n; i++)
{
scanf("%d,", &a[i]);
}
Shell_sort(a, n);
// print(a, n);
return 0;
}