算法思想
直插排序是特殊的希尔排序,直插排序每次插入前的遍历步长为1,而希尔排序初始步长为要排的数的一半,之后每执行一次步长折半。代码实现如下:
#include <stdio.h>
#include <malloc.h>
void Shell_sort(int *a, int len);
int main(void)
{
int i;
int len;
int * a;
printf("请输入要排的数的个数:");
scanf("%d",&len);
a = (int *)malloc(len * sizeof(int));
printf("请输入要排的数:\n");
for (i = 0; i < len; i++) {
scanf("%d",&a[i]);
}
Shell_sort(a, len);
printf("希尔升序排列后结果为:\n");
for (i = 0; i < len; i++) {
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}
void Shell_sort(int *a, int len)
{
int i;
int j;
int temp;
int gap;
for (gap = len / 2; gap >= 1; gap /= 2) {
for (i = 0 + gap; i < len; i += gap) {
temp = a[i];
j = i - gap;
while (j >= 0 && a[j] > temp) {
a[j + gap] = a[j];
j -= gap;
}
a[j + gap] = temp;
}
}
}