xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!

使用 js 实现十大排序算法: 堆排序

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。

大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;

堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点;

堆排序的平均时间复杂度为 Ο(nlogn)

不稳定,时好时坏

堆排序

  1. 大顶堆
  2. 小顶堆


"use strict";

/**
 *
 * @author xgqfrms
 * @license MIT
 * @copyright xgqfrms
 * @created 2020-10-01
 * @modified
 *
 * @description
 * @difficulty Easy Medium Hard
 * @complexity O(n)
 * @augments
 * @example
 * @link
 * @solutions
 *
 * @best_solutions
 *
 */

const log = console.log;

// 因为声明的多个函数都需要数据长度,所以把len设置成为全局变量
var len;

// 建立大顶堆
function buildMaxHeap(arr) {
  len = arr.length;
  for (var i = Math.floor(len/2); i >= 0; i--) {
    heapChange(arr, i);
  }
}

// 堆调整
function heapChange(arr, i) {
  var left = 2 * i + 1,
    right = 2 * i + 2,
    largest = i;
  if (left < len && arr[left] > arr[largest]) {
    largest = left;
  }

  if (right < len && arr[right] > arr[largest]) {
    largest = right;
  }

  if (largest != i) {
    swap(arr, i, largest);
    heapChange(arr, largest);
  }
}

function swap(arr, i, j) {
  var temp = arr[i];
  arr[i] = arr[j];
  arr[j] = temp;
}

function heapSort(arr) {
  buildMaxHeap(arr);
  for (var i = arr.length-1; i > 0; i--) {
    swap(arr, 0, i);
    len--;
    heapChange(arr, 0);
  }
  return arr;
}



refs

https://www.cnblogs.com/chengxiao/p/6129630.html

https://www.runoob.com/w3cnote/heap-sort.html

https://zhuanlan.zhihu.com/p/45725214



©xgqfrms 2012-2020

www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!


原文地址:https://www.cnblogs.com/xgqfrms/p/13947103.html