C++实现希尔排序法

希尔排序法是对直接插入排序法的优化,通过设置一个增量,对原始序列进行分组,对每组用直接插入排序法排序再整合,再缩小增量,周而复始直至增量为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 ShellSort(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<<"希尔排序:";
	ShellSort(a,11);

	system("pause");
	return 0;
}

运行结果:
这里写图片描述


欢迎关注知乎专栏:Jungle是一个用Qt的工业Robot
欢迎关注Jungle的微信公众号:Jungle笔记
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冯Jungle

您的支持是对我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值