希尔排序:
将整个待排记录分割为若干子序列,最后用直接插入排序。
这样可以使关键字比较小的记录跳跃式向前移动。最后直接插入排序的时候数组以基本有序。
#include<stdio.h>
#include<stdlib.h>
int list[4] = {7,5,3,1}; //增量表
int t=4; //增量个数
void ShellInsert(int *array,int length,int dk)
{
//和插入排序的区别就是增量由1变为dk
int i,k;
for(i=dk+1;i<=length;i++)
{
if(*(array+i) < *(array+i-dk))
{
//*array作为监视哨
*array = *(array+i);
for(k=i-dk;k>0&&(*array < *(array+k));k-=dk)
*(array+dk+k) = *(array+k);
*(array+k+dk)=*array;
}
}
}
void ShellSort(int *array,int length)
{
int k;
//对每个增量调用一次函数
for(k=0;k<t;k++)
ShellInsert(array,length,list[k]);
}
int main()
{
int i,length;
int *array;
scanf("%d",&length);
array = (int*)malloc(sizeof(int)*(length+1));
if(!array)exit(1);
for(i=1;i<=length;i++)
scanf("%d",array+i);
ShellSort(array,length);
for(i=1;i<=length;i++)
printf("%d ",*(array+i));
printf("\n");
free(array);
return 0;
}