美文网首页
前端-堆排序 (选择排序)

前端-堆排序 (选择排序)

作者: FConfidence | 来源:发表于2018-09-07 23:47 被阅读9次
  1. 堆排序

    • 小根堆: L[i] <= L[2i] && L[i] <= L[2i + 1]
    • 大根堆: L[i] >= L[2i] && L[i] >= L[2i + 1]
  2. 空间效率: O(1) 仅仅使用了常数个辅助单元
    时间效率: O(nlog2 n)
    稳定性: 不稳定

/**
 * 构建大根堆
 */
function buildMaxHeap(arr) {
  const len = arr.length - 1; // 因为arr[0] 暂存元素
  for (let i = parseInt(len / 2); i > 0; i--) {
    AdjustDown(arr, i)
  }
}

/*
 * 构建小根堆
 */

// 将元素i向下调整  形成大根堆
function AdjustDown(arr, k) {
  const len = arr.length - 1; // 因为arr[0] 暂存元素
  arr[0] = arr[k]; // arr[0] 暂存元素
  for (let i = 2 * k; i <= len; i *= 2) {
    if (i < len && arr[i] < arr[i + 1]) {
      i++;
    }
    // 筛选结束 表示当前节点已经在合适的位置上, 当前节点已经大于其所有的子节点
    if (arr[0] >= arr[i]) break;
    // 需要交换当前节点k和i的数据元素位置
    else {
      arr[k] = arr[i];
      k = i;
    }
  } // end for
  arr[k] = arr[0];
}

function HeapSort(arr) {
  const resultArr = [];
  const len = arr.length - 1;
  buildMaxHeap(arr)
  for (let i = len; i >= 1; i--) {
    // Swap(arr, i, 1);
    // 输出堆顶部的最大元素
    resultArr.push(arr[1])
    const tmp = arr[i]
    arr[i] = arr[1]
    // 将堆底部的元素放在顶部, 重新调整构造
    arr[1] = tmp;
    // 这里不能用slice
    arr.length = i;
    AdjustDown(arr, 1)
  } // end for
  return resultArr;
}

function buildMaxHeap_UP(arr) {
  const len = arr.length - 1; // 因为arr[0] 暂存元素
  for (let i = len; i > parseInt(i / 2); i--) {
    AdjustUp(arr, i);
  }
}

// 向上调整 形成大根堆
function AdjustUp(arr, k) {
  // var k = arr.length - 1;
  arr[0] = arr[k];
  let i = parseInt(k / 2);
  while (i > 0 && arr[i] < arr[0]) {
    arr[k] = arr[i];
    k = i;
    i = k / 2;
  } // end while
  arr[k] = arr[0];
}

const arr = [null, 53, 17, 78, 9, 45, 65, 87, 32];
// buildMaxHeap_UP(arr)

// buildMaxHeap(arr)
const resultArr = HeapSort(arr);

console.log(resultArr);
// console.log(arr.slice(1))

相关文章

  • 前端-堆排序 (选择排序)

    堆排序小根堆: L[i] <= L[2i] && L[i] <= L[2i + 1]大根堆: L[i] >= L[...

  • 排序

    目的 方便查找 内排序 交换 冒泡排序 快速排序 选择 直接选择 堆排序 插入 -直接插入 堆排序 基数排序

  • 03-堆排序(Heap Sort)

    堆排序(Heap Sort) 结合上一讲的内容,发现选择排序可以使用堆排序来进行优化。所以堆排序可以认为是对选择排...

  • 排序

    一、选择排序 1.堆排序 定义:堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序可参考http...

  • 3.2-选择排序-堆排序

    参考链接 选择排序:堆排序(Heap Sort) 白话经典算法系列之七 堆与堆排序 堆排序与快速排序,归并排序一样...

  • 常见的排序算法-2.1 选择排序(堆排序)

    选择排序的优化方案(堆排序)

  • iOS - 堆排序

    Demo_github 堆排序 堆排序(Heap Sort)是一种树形选择排序,是对直接选择排序的有效改进。 堆的...

  • 排序算法

    冒泡排序 插入排序 选择排序 归并排序 堆排序

  • 选择排序法

    常用的选择排序方法有两种:直接选择排序和堆排序。直接排序简单直观,但性能略差;堆排序是一种较为高效的选择排序方法,...

  • 数据结构

    Q:堆排序 A:1 堆排序算法(图解详细流程)2 堆排序 Q:排序算法时间复杂度与稳定性 选择排序为什么不稳定:举...

网友评论

      本文标题:前端-堆排序 (选择排序)

      本文链接:https://www.haomeiwen.com/subject/tjohgftx.html