希尔排序法的思想是:先取一个小于数组长度n的数d1作为第一个增量,把数组里面的n个数分成d1个组,数组中所有距离为d1的数都放在同一个小组中,分组过程见下图,再在各组里进行直接插入排序,然后取第二个增量d2<d1,重复上面的分组与排序,直至夺取的增量dt=1(dt<....<d2<d1)即所有的数放入同一组中进行直插排序为止。
整体程序如下:
#include<iostream>
using namespace std;
void Shell_pass1(int a[],int d);
void Shell_sort(int a[]);
void Shell_pass1(int a[],int d)
{//希尔排序中的一趟排序,d为当前增量
int i,temp,j;
for(i=d;i<7;i++)
if(a[i]<a[i-d])//将R[d..n]分别插入各组当前的有序区
{
temp=a[i];
j=i-d;
do{
a[j+d]=a[j];
j=j-d;//查找前一记录
} while(j>0&&temp<a[j]);
a[j+d]=temp;
}
}
void Shell_sort(int a[])
{
int increase=7;//增量初值
do
{
increase=increase/3+1;//求下一增量
Shell_pass1(a,increase);//一趟增量为increment的Shell插入排序
} while (increase>1);
}
int main()
{
int i,a[100];
cout<<"Please input 7 numbers: ";
for (i=0;i<7;i++)
cin>>a[i];
cout<<"The result of resort: ";
Shell_sort(a);
for (i=0;i<7;i++)
cout<<a[i]<<' ';
}