堆排序

简介: 概念:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

概念:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

*算法描述:

将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;

将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];

由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

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

       for (var i = arr.length - 1; i > 0; i--) {
           swap(arr, 0, i);
           len--;
           heapify(arr, 0);
       }


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

       function heapify(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);
           heapify(arr, largest);
           }
       }

       function swap(arr, i, j) {
           var temp = arr[i];
           arr[i] = arr[j];
           arr[j] = temp;
        }
   return arr;
   }
   var arr = [2,6,5,3,8,4,10,23];
   console.log(arr); // [2, 6, 5, 3, 8, 4, 10, 23]
   heapSort(arr);
   console.log(arr); // [2, 3, 4, 5, 6, 8, 10, 23]
相关文章
|
JSON 自然语言处理 Java
es索引、类型(mapping)、文档、ik分词器
es索引、类型(mapping)、文档、ik分词器
297 1
|
弹性计算 负载均衡 Kubernetes
slb的LoadBalancer
slb的LoadBalancer
318 2
|
9月前
|
JavaScript 前端开发
Node.js 中实现多任务下载的并发控制策略
Node.js 中实现多任务下载的并发控制策略
252 15
|
6月前
|
编译器 开发工具 Android开发
HarmonyOS组件化项目搭建
本文详细讲解了HarmonyOS组件化项目搭建的全过程,帮助开发者实现一个组件化项目。首先介绍了项目创建的基本步骤,包括使用DevEco Studio创建工程和EmptyAbility模块。接着说明了公共库(Common组件)的创建与使用,通过添加静态库并配置依赖关系实现模块化管理。随后阐述了功能模块(如Login模块)的创建流程,采用共享库形式并完成依赖配置。最后重点介绍了模块间路由跳转的实现方法,利用HarmonyOS的router机制完成页面跳转,并通过定义全路径和ConstantRouter类实现跨模块调用。随着鸿蒙生态发展,学习相关技术将成为趋势。
225 0
HarmonyOS组件化项目搭建
|
JavaScript 前端开发 API
【前端开发】JS同步与异步调用,Vue2基础知识
本文简要介绍了JavaScript中的同步与异步调用以及Vue2的基础知识。 ### JS同步与异步调用 - **同步调用**:代码按顺序执行,每个任务完成后才执行下一个。 - **异步调用**:允许代码并发执行,不必等待前一个任务完成。 - **回调函数**:传统异步模式,如`setTimeout`。 - **Promise**:解决回调地狱问题,链式调用 `.then()`。 - **async/await**:基于Promise,使异步代码看起来像同步代码。 ### Vue2基础知识 - **核心概念**:指令、实例、组件、模板、数据绑定和生命周期钩子。 - **指令**
565 5
|
缓存 安全 Go
2.Channels
2.Channels
|
存储
【初阶数据结构篇】实现链式结构二叉树(二叉链)下篇
要改变root指针的指向,将本来指向根节点的root指针改为空,所以传二级指针(一级指针也可以,只不过在调用完记得把root置为空)。
114 0
|
存储 弹性计算 运维
阿里云电脑无影在哪里申请购买?无影云电脑价格介绍
阿里云电脑无影在哪里申请购买?无影云电脑价格介绍
315 0
阿里云怎么注册商标?(附详细商标注册申请操作流程)
阿里云商标注册分为商标智能注册申请、商标顾问注册申请和商标安心注册申请,本文阿小云以商标智能注册申请为例来详细说下阿里云商标申请图文操作流程:
6461 0
阿里云怎么注册商标?(附详细商标注册申请操作流程)
|
Java 程序员 应用服务中间件
2023秋招,Java岗最全面试攻略,面试必刷,跳槽大厂神器!
现在 Java 面试可以说是老生常谈的一个问题了,确实也是这么回事。面试题、面试宝典、面试手册......各种 Java 面试题一搜一大把,根本看不完,也看不过来,而且每份面试资料也都觉得 Nice,然后就开启了收藏之路。 Java 开发者应该是不会很容易满足的,现在拿着 20K 的工作,下一步就想着拿 50K 的 offer,甚至年薪百万都是程序员很常见的,不满足于现状,身在其位就要有担当其位的能力,不断提升技能、技术栈,都是必不可少的! 其实很多人,对本身没有一个清楚的规划,甚至不知道适合什么路线,这样的话,你就会离心仪的 offer 越来越远!无论何时,都需要对自身有一个清楚的认知,