希尔排序,也叫递减增量排序,是插入排序的一种更高效的改进版本,是不稳定的排序算法。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
1、插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
2、但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位
希尔排序通过将要排序的全部元素分为几个区域来提升插入排序的性能,让需要移动的数向要移动的方向一次走一大步。然后取越来越小的步长进行排序,最后进行一次普通的插入排序,此时需排序的数几乎已经是排好的了,插入排序较快#include <stdio.h>
void printA(int *a,int len)
{
int i;
for(i = 0; i < len; i++)
{
printf("%4d",a[i]);
}
printf("\n");
}
void shell(int *a, int len)
{
int i,j,get;
int d = len;
do
{
d = d/3+1; //每次的步长
for(i = d; i < len; i++)
{
get = a[i];
j = i-d;
while(j >= 0 && a[j] > get)
{
a[j+d] = a[j];
j = j-d;
}
a[j+d] = get;
}
}while(d>1);
}
int main()
{
int a[10] = {7,2,9,4,1,3,8,6,5,0};
int len = sizeof(a)/sizeof(a[0]);
shell(a,len);
printA(a,len);
return 0;
}