八大排序之堆排序--堆排序 java
堆排序及其优化 java https://www.cnblogs.com/CherishFX/p/4643940.html 堆排序,是利用堆结构进行排序,一般是利用最大堆,即根节点比左右两个子树的节点都大。 堆排序是一种树形选择排序方法,它的特点是:在排序的过程中,将array[0,…,n-1]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲节点和孩子节点之间的内在关系,在当前无序区中选择关键字最大(最小)的元素。 1、什么是堆? 堆是有如下特点的二叉树: 1)它是完全二叉树。即除了树的最后一层节点不需要是满的,其他的每层从左到右完全是满的。 2)它常常是数组实现的。 3)堆中的每个节点都必须满足堆的条件。 每个节点的关键字都不大于其子节点的关键字,这种堆称为小根堆。 每个节点的关键字都不小于其子节点的关键字,这种堆称为大堆根。本文采用此结构演示 综上所述,堆是一棵顺序存储的按照特定规则的完全二叉树。 数组的节点的索引为index,则: 1)它的父节点的下标为:(index-1)/2 2)它的左子节点的下标为:2 index + 1 3)它的右子节点的下标为:2 index + 2 2、堆与二叉搜索树的不同: 堆和二叉搜索树相比是弱序的。在二叉搜索树中,所有节点的关键字大于其左子树的关键字,小于其右子树的关键字。但是在堆中,每个节点都不小于其子节点,即从