C++实现希尔排序法

Deadly 提交于 2019-12-02 06:44:32

希尔排序法是对直接插入排序法的优化,通过设置一个增量,对原始序列进行分组,对每组用直接插入排序法排序再整合,再缩小增量,周而复始直至增量为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笔记
在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!