1.算法思路:
第一趟:n/3向下取整+1=3。将整个数据列划分为间隔为3的3个子序列,然后对每一个子序列执行直接插入排序,相当于对整个序列执行了部分排序调整。
第二趟:将间隔increment= increment/3向下取整+1=2,将整个元素序列划分为2个间隔为2的子序列,分别进行排序。
第3趟:把间隔缩小为increment= increment/3向下取整+1=1,当增量为1的时候,实际上就是把整个数列作为一个子序列进行插入排序 。
2.代码实现:
#include <stdio.h>
#define N 8
void show(int a[])
{
int i;
for(i = 0;i < N;i++)
printf("%d\t",a[i]);
printf("\n");
}
void seqsearch(int a[])
{
int i,j,tmp;
int d;
for(d = N/2; d > 0; d /= 2){
for(i = d;i < N;i++){
tmp = a[i];
for(j = i-d; j >= 0;j -= d)
if(tmp < a[j])
a[j+d] = a[j];
else
break;
a[j+d] = tmp;
}
show(a);
}
}
int main(void)
{
int a[N] = {21,25,49,25*,16,08};
show(a);
seqsearch(a);
return 0;
}