希尔排序
摘自帅地玩编程
如果不是很理解的话,可以点击上方链接,去看原文
希尔排序是对插入排序的优化算法,将原数组进行分组,然后再组间进行插入排序
定义 gap
为分组间的增量,初始为 arr.length
的一半,然后每次减半,这样效率较高
每次调用插入排序将每一组排好序,这样可以使组内是有序的
增量减半为2,继续排序
增量减半为1,数组已变成有序
以上便是希尔排序的思路
代码
/**
*@author:WQL
*@date:2022/3/22
*@description:希尔排序
*@version:C++
*/
#include<iostream>
#include<vector>
using namespace std;
// 插入排序
void insertSort(vector<int>& nums, int gap, int i) {
// 变量 j 每次都向前移动 gap 长度
for (int j = i - gap; j >=0 && nums[j] > nums[j + gap]; j -= gap) {
swap(nums[j], nums[j + gap]);
}
}
// 希尔排序
void shellSort(vector<int>& nums) {
int len = nums.size();
if (len == 0) return;
// 增量 gap 初始为 数组长度的一半,并且每次 减半
for (int gap = len >> 1; gap >= 1; gap >>= 1) {
for (int i = gap; i < len; i++) {
// 从第一组的最后一个数开始,依次递增开始插入排序,这样每一组都可以排好序
insertSort(nums, gap, i);
}
}
}