《经典排序算法-希尔排序》

希尔排序
希尔排序也叫缩小增量排序,希尔排序使用一个序列h1,h2,…ht,叫增量序列,使用增量hk的一趟排序之后,对于每一个i我们都有A[i]<=A[i+K];所有相隔hk的元素都被排序,称文件为hk排序的。希尔排序重要性质是hk排序的文件保持它的hk排序性。
在这里插入图片描述
hk排序对于hk,hk+1,…N-1中的每一个位置i,把其上的元素放到i,i-hk,i-2*hk…中间的正确位置上,一趟hk排序的作用就是对hk个独立的子数组执行一次插入排序。
增量序列选择shell建议的序列(效率不高),ht=N/2和hk=hk+1/2。
存在一些其它的递增序列对算法运行时间做出重要的改进。
程序:

#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;
void ShellSort(std::vector<int> A, int N)
{
	int i, j, Increment;
	int Tmp;
	for (Increment = N / 2; Increment >0; Increment /= 2)
		for (i = Increment; i<N; i++)
		{
			Tmp = A[i];
			for (j = i; j >= Increment; j -= Increment)
				if (Tmp<A[j - Increment])
					A[j] = A[j - Increment];
				else
					break;
			A[j] = Tmp;
		}
	cout << "the sorted number:" << endl;
	for_each(A.begin(), A.end(), [](int val)//for_each加lambda表达式遍历vector
	{
		cout << val << " ";
	});
}
int main()
{//输入示例81 94 11 96 12 35 17 95 28 58 41 75 15
	int temp;
	std::vector<int> nums;
	cout << "please input number:" << endl;
	while (cin >> temp)
	{
		nums.push_back(temp);
	}
	ShellSort(nums,nums.size());

	return 0;
}

希尔排序最坏情况分析
定理3 使用希尔增量时希尔排序的最坏情形运行时间为θ(N^2)
定理4 使用Hibbard增量的希尔排序最坏情况运行时间为θ(N^3/2)
经实践运行效果好的Sedgewick序列9*4i-9*2i+1或者4i-3*2i+1。它们的实际效果比Hibbard序列还要好。
希尔排序的性能在实践中完全可接受,解释对于数以万计的N也如此,编程简单的特点使他成为对适当地大量输入数据经常选用的算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值