一、堆

堆排序是利用堆这种数据结构来设计的一种排序算法,是一种选择排序(每轮排序会选出一个最大/最小值),最坏、最好、平均时间复杂度均为O(nlogn),是不稳定的排序。

使用堆排序,可以是一个动态的过程,若题目中只需某个排序位的值,则只需排序置该位置,不用全排序好再去拿,只需要针对部分元素进行排序,这样可以降低复杂度。

堆排序过程中,是看不到树的结构的,因为使用完全二叉树的性质,用数组表示对应的树结构,又叫顺序存储。

顺序存储二叉树的特点:

  • 第n个元素父节点为(n-1)/2
  • 第n个元素左子节点为2*n+1
  • 第n个元素右子节点为2*n+2
  • 最后一个非叶子结点为Math.floor(arr.length/2)-1

堆 是具有以下性质的完全二叉树:

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

堆排序的基本思想:

1、将待排序序列构造成一个大顶堆(数组)

2、此时整个序列的最大值就是堆顶的根节点

3、将其与末尾元素进行交换,此时尾元素就是最大值

4、再将剩余n-1个元素重新构建成一个堆,这样可以得到n个元素的次最大值。如此反复,可以得到一个有序序列。

二、如何构建堆并排序

下面以数组[3,5,8,6,10]进行堆排序:

步骤一:构造初始堆

1、(操作的为数组)

将给定无序序列构造成一个大顶堆

2、此时从最后一个非叶子结点开始调整,从左往右,从上往下进行调整

叶节点不做调整,第一个非叶子结点:arr.length/2-1 =5/2-1 = 1,元素5的结点

比较非叶子结点的左右结点,先让6,10比较,得到大的,再和当前结点5作比较,发现10大于5,则交换位置。

3、找到第二个非叶子结点3,[3,10,8]中,元素10最大,则交换3,10

4、交换使得子根[3,6,5]结构排乱,所以再对其进行调整,[3,6,5]中6最大,将3,6位置进行调换

于是便将一个无序序列构建成为一个大顶堆

步骤二:将堆顶元素与末尾元素进行交换

将堆顶元素与末尾元素进行交换,交换后使末尾元素变为最大。再继续上述步骤,得到第二大元素,如此反复交换便可完成排序堆的构造。

1、将堆顶元素10与末尾元素交换

  2、重新调整结构,使其满足堆定义

3、再将堆顶元素8与末尾元素3进行交换,得到第二大元素8

4、如此反复,最终使得整个序列有序

三、总结:

1、将无序序列构建成一个堆,根据升序降序决定是大顶堆还是小顶堆

2、将堆顶元素与末尾元素交换,将最大元素“沉”到数组末端

3、重新调整结构,使其满足堆定义,然后继续交换堆顶与当前末尾元素,如此反复,直至整个序列有序

四、代码

var Heap = function(nums) {let heapSize=nums.lengthbuildMaxHeap(nums,heapSize) // 构建好了一个大顶堆// 进行下沉 大顶堆是最大元素下沉到末尾for(let i=nums.length-1;i>=0;i--){swap(nums,0,i)--heapSize // 下沉后的元素不参与到大顶堆的调整// 重新调整大顶堆maxHeapify(nums, 0, heapSize);}console.log(nums)// 自下而上构建一颗大顶堆function buildMaxHeap(nums,heapSize){for(let i=Math.floor(heapSize/2)-1;i>=0;i--){maxHeapify(nums,i,heapSize)}}// 从左向右,自上而下的调整节点function maxHeapify(nums,i,heapSize){let l=i*2+1let r=i*2+2let largest=iif(l < heapSize && nums[l] > nums[largest]){largest=l}if(r < heapSize && nums[r] > nums[largest]){largest=r}if(largest!==i){swap(nums,i,largest) // 进行节点调整// 继续调整下面的非叶子节点maxHeapify(nums,largest,heapSize)}}function swap(a,  i,  j){let temp = a[i];a[i] = a[j];a[j] = temp;}
};

排序算法---堆排序相关推荐

  1. 经典排序算法 - 堆排序Heap sort

    经典排序算法 - 堆排序Heap sort 堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 ...

  2. 排序算法 - 堆排序

    堆排序是指利用堆这种数据结构所设计的一种排序算法. 类型:选择排序 时间复杂度(最坏):O(nlogn) 时间复杂度(最好):O(nlogn) 时间复杂度(平均):O(nlogn) 空间复杂度:O(1 ...

  3. 排序算法 | 堆排序,算法的图解、实现、复杂度和稳定性分析

    今天讲解一下堆排序的原理以及实现.复杂度和稳定性分析 目录 1 堆的定义 2 堆排序的思路 3 代码实现 4 堆的输出(删除操作) 5 堆的插入操作 6 堆排序的特点 7 性能分析 1 堆的定义 堆排 ...

  4. php+堆排序算法,排序算法-堆排序-php

    什么是堆排序 堆排序是我们经常使用的排序算法,它是利用堆的结构进行排序,堆是一种二叉树结构,并且它的父节点的值都大于子节点或者都小于子节点,如果大于,就是大顶堆,如果小于就是小顶堆. 根据堆的定义,我 ...

  5. 数据结构与算法 / 排序算法 / 堆排序

    一.定义 借助堆结构实现的排序算法被称为堆排序. 二.过程说明 1.建堆 (1)方法1 原地建堆,对于数组来说,从前往后:对于树来说,从下向上. 将数组的第一个元素作为堆顶,第二个元素做向堆中插入数据 ...

  6. 排序算法-堆排序(C语言版)

    堆排序是一种基于完全二叉树结构的一种排序算法,其整体思想很简单,就是构建完全二叉树,但是这里需要引入堆的概念.如下 大顶堆:每个结点的值都大于或等于其左右孩子结点的值 小顶堆:每个结点的值都小于或等于 ...

  7. 十大经典排序算法----堆排序(超详细)

    目录 1. 堆排序的基础知识 1.1 大顶堆&&小顶堆 1.2 向下调整算法 1.3 物理结构与逻辑结构的关系 2. 堆排序详解 2.1 堆排序整体思路 2.2 思路详解 2.2.1  ...

  8. 排序算法 —— 堆排序

    引言 此文基于<经典数据结构--堆的实现>中堆结构,实现一个以堆处理排序的算法. 一.算法思想 基于堆结构的堆排序的算法思想非常简单,循环获取大根堆中的最大值(0位置的根节点)放到堆的末尾 ...

  9. 八大排序算法--堆排序

    序言 对于堆排序的学习,实际上就是对于 堆 这一种数据结构的学习,把堆学会了,堆排序自然也就学会了. 1.为什么使用堆这种数据结构 优先队列是一种很常用的队列,比如在游戏中,游戏角色在自动模式下,如何 ...

  10. 排序算法-------堆排序

    对于n个元素的序列{R0, R1, ... , Rn}当且仅当满足下列关系之一时,称之为堆: (1) Ri <= R2i+1 且 Ri <= R2i+2 (小顶堆) (2) Ri > ...

最新文章

  1. 机房收费系统总结【4】-报错码
  2. centos7 安装mysql php_Centos7安装mysql与php的方法
  3. false shell 判断_Shell 流程控制
  4. CSS里:focus-within 的作用和用法
  5. The test form is only available for requests from the local machine解决方法
  6. GEETEST极验召集互联网大佬齐聚光谷,共同探讨交互安全问题
  7. [PHP] 网络与协议
  8. 区块链应用 | 区块链火了,这到底是虚火还是实火?
  9. c语言dll导出函数举例,DLL中导出函数的两种方式(dllexport与.def文件)
  10. 最近开发的NFC读写器控制软件
  11. Qt4--加密日记本(子例化QMainWindow文本加密解密)
  12. 计算机专业认识实习目的,计算机专业实习目的及意义
  13. 16 台服务器达成 1000 万 tpmC!挑战分布式数据库性能极限
  14. 修改dns服务器转发器,域服务器dns设置转发器
  15. Office EXCEL 创建图片超链接打不开怎么办 Excel打开图片提示发生了意外错误怎么办
  16. 2020-09-13 滴滴-2021校招在线笔试-DE数据开发试卷
  17. 农家乐微信小程序开发功能
  18. 交换机和BBU的接口编号以及华为ATN950 BBU接口写法
  19. java集成seetaface_开源人脸识别seetaface入门教程(一)
  20. 深剖基类和派生类的虚函数表

热门文章

  1. java 异或运算符^
  2. 双机热备份VRRP原理详解(附实验)
  3. Linein和Micin的区别
  4. arcgis 实验教程 第二章 ArcCatalog 简单操作--字段排序
  5. 党建管理系统开发,组织部干部人事任免平台建设方案
  6. latex 数学公式_推荐一款编写数学公式的国产神器:AxMath,可与LATEX双向转换
  7. 雷达模块感应技术,智能照明LED灯的应用,5.8G雷达感应模块
  8. SSD1306 芯片 手册官方网址
  9. 安装星际译王与本地词典
  10. Python爬虫 抓取拉勾招聘信息