十大排序4 希尔排序

    希尔排序可以说是插入排序的一种优化,采取跳跃分割的方式,将相距某个**“增量”**的记录组成一个子序列,进行插入排序,这样得到的结果是基本有序的。再逐渐的缩小增量,直至增量为1;

注意点:
1、用个do - while循环, while (increment > 1); 为了最后一次循环increment = 1;
2、初始增量 设为 n / 3 + 1;(也可以别的),放在while循环里
3、类似与插入排序,这边得从自身i开始,所以得 a[j + increament ] = a[j]

#include <iostream>
#include <vector>

using namespace std;
void shellSort(vector<int> &array) {
	int increment = array.size();
	do
	{
		increment = increment / 3 + 1;   //初始增量 设为 n / 3 + 1;

		//开始插入排序了,注意初始值莫要 + 1,这样可以从 0 下标元素开始。
		for (int i = increment; i < array.size(); i++) {     
			if (array[i] < array[i - increment]) {
				int temp = array[i];
				int j = 0;
				for ( j = i - increment; j >= 0 && array[j] > temp; j = j - increment) {  //注意: j >= 0; 每次减少 一个增量
					array[j + increment] = array[j];         //类似与插入排序,这边得从自身i开始,所以爹 j + increament  =   j
				}
				array[j + increment] = temp;
			}
		}
	} while (increment > 1);  //为了最后一次循环increment = 1;
}
int main() {
	//solution solo;
	vector<int> array = { 6,3,2,1,8,7,5,9,4 };
	shellSort(array);
	for (auto i : array) {
		cout << i << endl;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值