Skip to content

Latest commit

 

History

History
64 lines (52 loc) · 1.68 KB

heapSort.md

File metadata and controls

64 lines (52 loc) · 1.68 KB
标题 标签
heapSort(堆排序算法) algorithm,array,recursion(算法,数组,递归)

使用堆排序算法对数字数组进行排序。

  • 使用递归。
  • 使用扩展运算符 (...) 克隆原始数组 arr。
  • 使用闭包来声明一个变量 l 和一个函数 heapify。
  • 使用 for 循环和 Math.floor() 结合 heapify 从数组创建一个最大堆。
  • 使用 for 循环重复缩小考虑的范围,根据需要使用 heapify 和交换值,以便对克隆的数组进行排序。
const heapSort = arr => {
  const copyArr = [...arr];
  let l = copyArr.length;
  // 创建一个最大堆
  const heapify = (data, i) => {
    const left = 2 * i + 1,
      right = 2 * i + 2;

    let max = i;
    // 计算最大堆
    if (left < l && data[left] > data[max]) {
      max = left;
    }
    if (right < l && data[right] > data[max]) {
      max = right;
    }

    if (max !== i) {
      // 数组结构交换元素
      [data[max], data[i]] = [data[i], data[max]];
      // 递归
      heapify(data, max);
    }
  };

  for (let i = Math.floor(l / 2); i >= 0; i--) {
    heapify(copyArr, i);
  }
  // 重复缩小范围
  for (let i = copyArr.length - 1; i >= 0; i--) {
    [copyArr[0], copyArr[i]] = [copyArr[i], copyArr[0]];
    l--;
    heapify(copyArr, 0);
  }
  return copyArr;
};

调用方式:

heapSort([6, 3, 4, 1]); // [1, 3, 4, 6]

应用场景

结果如下:

<iframe src="codes/javascript/html/heapSort.html"></iframe>