希尔排序又叫做减小增量排序,是对插入排序的改进。希尔排序是按下标的一定增量分组,然后对各组进行插入排序。它是一种不稳定的排序方法。
希尔排序的排序方法(以将a[n]从小到大排序为例):
首先选取小于n的增量d1,将a[n]分成d1组,对这d1组数据分别进行插入排序,然后选取小于d1的增量d2,将a[n]分成d2组,对这d2组数据分别进行插入排序,之后继续缩小选取的增量,直到选取的增量为1时,所有数据分在一组,排序完成。
具体代码如下:
//-------------------
// 希尔排序
//-------------------
#include<cstdio>
#define size 10
int a[]={2,4,3,5,8,6,7,9,1,5};
void print()
{
for(int i=0;i<size;i++)
printf(" %d",a[i]);
printf("\n");
}
void shell_sort(int a[],int n)
{
int i,j,k,gap,temp;
for(gap=n/2;gap>=1;gap/=2)
{
for(i=0;i<gap;i++)
for(j=i+gap;j<n;j+=gap)
if(a[j]<a[j-gap])
{
temp=a[j];
for(k=j-gap;k>=0&&temp<a[k];k-=gap)
{
a[k+gap]=a[k];
}
a[k+gap]=temp;
}
printf("增量为%d时排序后的数组:",gap);
print();
}
}
int main()
{
printf("未排序的数组:");
print();
shell_sort(a,size);
printf("执行希尔排序后的数组:");
print();
return 0;
}
代码运行结果如下:
从代码运行结果可以看出希尔排序为什么效率比插入排序要高。开始的时候,步长很大,所以每个分组中的元素很少,所以效率高,到后面步长很小的时候,每个分组中的元素很多,但是由于这时数组已经基本有序了,所以排序的效率仍然很高。