数据结构之希尔排序

        直接插入排序在数据量较小而且接近"正序"的时候,时间复杂度可以小至O(n),所以如果我们能够让数据量变小且变得接近"正序",然后用直接插入排序就好了。希尔排序就是做这么个事情,它首先将数据拆成几部分,即达到缩小数据规模排序,再将数据合并起来,达到整体的"正序",然而将数据的正序并非局部的"正序",即不是(6,7,8, 3,4,5, 0,1,2),而是整体的正序,所以在将数据分割成几组的时候不能一堆堆的分割,而应该跳跃式分割,用一个系数d来控制。

#include <iostream>
using namespace std;
// 希尔插入,和直接插入唯一不同的是,每个元素位置相隔不是1,而是d,其他一模一样
// 即只要d传入1,就是直接插入排序
void shellInsert(int src[], int d,int n)
{
	// 哨岗元素
	int save;
	int j;
	for (int i = d; i <= n; ++i)
	{
		save = src[i];
		// 逐个与前面(-d)的元素进行比较
		for (j = i; j-d>=0 && save<src[j-d]; j-=d)
		{
			src[j] = src[j-d];
		}
		src[j] = save;
	}
}
void shellSort(int src[], int n)
{
	// 每次将数据分割成几组,然后进行直接插入排序
	// d的选择是很重要的,质数,奇数,避免相互倍数,最后一个一定要为1
	// 这里的d是随便写的,没有经过仔细考虑的,查了几本数据结构的树,有一本是d=d/3+1(d初始化时为n)
	for (int d = (n+1)/2; d>=1; d = d/2)
	{
		shellInsert(src, d, n);
	}

}
int main()
{
	int src[10] = {4,5,6,7,8,9,1,2,3,0};
	int number = 9;
	shellSort(src, number);
	for (int i = 0; i <= number; ++i)
		cout<<src[i]<<" ";
	cout<<endl;
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值