希尔排序法是对直接插入排序法的优化,通过设置一个增量,对原始序列进行分组,对每组用直接插入排序法排序再整合,再缩小增量,周而复始直至增量为1,完成排序,因此又叫**“缩小增量排序法”**。本节Jungle图文并茂介绍一下希尔排序法,并给出C++代码。
1.举例说明希尔排序法过程
以一个整数序列为例来说明{12,45,90,1,34,87,-3,822,23,-222,32},该组序列包含N=11个数。不少已有的说明中通常举例10个数,这里说明一下,排序算法与序列元素个数无关!
- 首先声明一个参数:增量gap。gap初始值设置为N/2。缩小方式一般为gap=gap/2.
- 第一步,gap=N/2=5,每间隔5个元素取一个数,组成一组,一共得到5组:
对每组使用插入排序算法,得到每组的有序数列:
至此,数列已变为: - 第二步,缩小gap,gap=gap/2=2,每间隔2取一个数,组成一组,共两组:
同理,分别使用插入排序法,得到每组的有序数列:
至此,数列已变为: - 第三步,进一步缩小gap,gap=gap/2=1,此时只有一组,直接使用插入排序法,玩完成排序,图略。
2.C++代码实现
每次分组排序,都打印出当前的序列状况以及当前的gap:
void hillSort(int arr[],int N)
{
int i,j,gap;
for(gap = N/2;gap>0;gap/=2)
{
// 每组进行插入排序
for(i=0;i<N;i++)
{
for(j=i-gap;j>=0;j-=gap)
{
if(arr[i]>arr[j])
break;
}
int temp = arr[i];
for(int k=i;k>j;k-=gap)
arr[k] = arr[k-gap];
arr[j+gap] = temp;
}
// 打印当前的gap和序列状态
cout<<"\ngap="<<gap;
cout<<"\ncurrent list:";
for(int h=0;h<N;h++)
cout<<arr[h]<<" ";
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[11] = {12,45,90,1,34,87,-3,822,23,-222,32};
cout<<"原始数列:";
for(int i=0;i<11;i++)
cout<<a[i]<<" ";
cout<<endl;
cout<<"希尔排序:";
hillSort(a,11);
system("pause");
return 0;
}
运行结果:
欢迎关注知乎专栏:Jungle是一个用Qt的工业Robot
欢迎关注Jungle的微信公众号:Jungle笔记
来源:CSDN
作者:冯Jungle
链接:https://blog.csdn.net/sinat_21107433/article/details/80946732