描述
希尔排序可以看作是一个冒泡排序或者插入排序的变形。希尔排序在每次的排序的时候都把数组拆分成若干个序列,一个序列的相邻的元素索引相隔的固定的距离gap
,每一轮对这些序列进行冒泡或者插入排序,然后再缩小gap
得到新的序列一一排序,直到gap
为1
比如对于数组[5,2,4,3,1,2]
,第一轮gap=3
拆分成[5,3]、[2,1]
和[4,2]
三个数组进行插入排序得到[3,1,2,5,2,4]
;第二轮gap=2
,拆分成[3,2,2]
和[1,5,4]
进行插入排序得到[2,1,2,4,3,5]
;最后gap=1
,全局插入排序得到[1,2,2,3,4,5]
。
C++代码实现
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
int gap = nums.size() / 2;
while (gap > 0) {
for (int i = 0; i < gap; i++) { // 对每个子序列进行排序
for (int j = i+gap; j < nums.size(); j+=gap) { // 插入排序的部分
int temp = j;
while (temp > i && nums[temp] < nums[temp-gap]) {
swap(nums, temp, temp-gap);
temp -= gap;
}
}
}
gap -= 1;
}
return nums;
}
private:
void swap(vector<int>& nums,int m,int n){
int temp = nums[m];
nums[m] = nums[n];
nums[n] = temp;
}
}
希尔排序算法,运行时间在很大程度上取决于它使用的间隔,在实际使用中,其时间复杂度仍然是一个悬而未决的问题,基本在*O(n2)和O(n4/3)*之间。
空间复杂度是O(1),是原地算法。
这个算法是不稳定的,里面有很多不相邻元素的交换操作。