Shell Sort

Shell Sort 希尔排序

是插入排序的升级版, 如果会插入排序, 希尔排序会变得非常简单;

插入排序是以步长为1的, 而希尔排序步长更大, 有效的减少实践复杂度

先来看插入排序

void insertSort(int data[],int n)
{
	for (int i = 1; i < n; i++)
	{
		int temp = data[i];
		int j = i - 1;
		while (j >= 0 && data[j]>temp) //data[j]从右往左移动,直到找到一个比temp小的data[j](即data[j]<=temp)(即data[j]越往左移值越小)循环结束,可知这是一个升序排序    
		{
			data[j + 1] = data[j];
			j--;
		}
		data[j + 1] = temp;
	}
}

再来看希尔排序

vector<int>G;
void insertSort(int data[],int n,int g)
{
	for (int i = 1; i < n; i++)
	{
		int temp = data[i];
		int j = i - g;
		while (j >= 0 && data[j]>temp) //data[j]从右往左移动,直到找到一个data[j]<=temp循环结束,可知这是一个升序排序
		{
			data[j + g] = data[j];
			j-=g;
		}
		data[j + g] = temp;
	}
}
void shellSort(int data[], int n)
{
	for (int g = 1; g <= n; g = 3 * g + 1)  //生成一个由g构成的集合G
		G.push_back(g);

	for (int i = G.size() - 1; i >= 0; i--)
		insertSort(data, n, G[i]);
}

希尔排序保留了插入排序,但是这个插入排序不再以步长1移动,而是G,G是一个集合, G=1,4,13....,即插入排序的步长是在变的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值