zoukankan      html  css  js  c++  java
  • 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 发布文章使用:只允许注册用户才可以访问!


  • 相关阅读:
    jvm调优
    Spring 事务
    Spring Framework入门介绍
    redis入门介绍
    Spring与SpringMVC重复扫描问题
    跨域相关问题
    Spring MVC介绍
    Servlet、Servlet容器
    获取屏幕宽高
    mybatis中比较符的写法
  • 原文地址:https://www.cnblogs.com/xgqfrms/p/13947103.html
Copyright © 2011-2022 走看看