插入排序的改进版本
因为插入排序中如果nums[j-1] < nums[j]就不用交换,因此在拍好序的数据中效率很高
「思路:分组」
h:每组的元素
5(ℹ),4(j),3(i),2(j),6(i) h=2(i,j)
i:536
j:42
插入排序
i:5 > 3 356
5 < 6【break】 356
j: 4 > 2 24
32546 h=1
3 >2 23546
5>3 23546
4 < 5 23456
function sortArray(nums: number[]): number[] {
let len = nums.length;
if (len === 1) {
return nums;
}
//设置分组间隔
let h = Math.floor(len/3);//分几组
console.log(h);
while (h >= 1) {
//h有序
for (let i = h; i < len; i++) {//+h是一次性比较同一组,++是按分组顺序比
for (let j = i; j > 0 && nums[j] < nums[j - h]; j -= h) {
[nums[j], nums[j - h]] = [nums[j - h], nums[j]];
}
}
h--;//递减,最终h等于1就行
}
return nums;
}
时间复杂度:O(n(logn)^2) 空间复杂度:O(1) 不稳定