希尔排序

84 阅读1分钟

插入排序的改进版本

因为插入排序中如果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 < 6break356
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) 不稳定