1 原理
希尔排序可以看作是对直接插入排序的优化. 直接插入是从前到后遍历数组, 每一个元素都往前移动到最合适的位置. 而希尔排序是利用间隔对数组进行分组, 然后再对每个小组进行子排序, 直到间隔为1.
2 具体步骤
首先要介绍一下间隔是什么.
间隔: 间隔是确定子分组的依据, 间隔是多少, 就有多少个子分组, 例如:
数组为: 7,3,2,5,8,1,6,9,0,4, 如果此时间隔为3, 那么如果两个数的间隔为三, 那么二者就为一组, 因为间隔多少就有多少组, 也就是说此时应该有三组, 其索引是:
- 0, 3, 6, 9
- 1, 4, 7
- 2, 5, 8
对应的元素为:
- 7, 5, 6, 4
- 3, 8, 9
- 2, 1, 0
了解了间隔之后, 下面就是希尔排序的具体步骤了(还是以上面的数组为例子).
1. 初始间隔为数组长度的一半(例子中数组长度为10, 初始间隔为5)
2. 把数组按照间隔进行分组, 组数为间隔大小(例中此时间隔为5, 那也就是第0, 5 一组, 1,6一组, 2, 7一组, 3, 8一组, 4, 9一组)
3. 对每个小组进行插入排序
4. 间隔除以2, 如果>0, 重复第二步.
代码:
vector<int> sortArray(vector<int>& nums) {int n = nums.size();int gap = n / 2;while (gap) {for (int i = 0; i < gap; i ++) {for (int cur_i = i + gap; cur_i < n; cur_i += gap) {for (int ii = cur_i; ii >= gap && nums[ii] < nums[ii - gap]; ii -= gap) {swap(nums[ii], nums[ii - gap]);}}}gap /= 2;}return nums;
}