博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
堆排序—Java
阅读量:5966 次
发布时间:2019-06-19

本文共 1374 字,大约阅读时间需要 4 分钟。

堆排序:

一棵完全二叉树,如果父节点的值大于等于左右节点的值,则称此完全二叉树为小根堆(小顶堆);如果父节点的值小于等于左右节点的值,则次完全二叉树为大根堆(大顶堆)。

堆排序是建立在大顶堆或小顶堆的基础上的,通过不断的交换堆顶元素和堆尾元素,来对数组排序。基于大顶堆的堆排序,数组排序结果是升序的。基于小顶堆的堆排序,数组排序结果是降序的。

流程:

(1)建立堆 (注意调整的顺序是:从右往左,从下往上)
(2)交换堆顶与堆底元素
(3)调整堆(注意调整的顺序是:从0开始)

代码:

public class DuiPaiXu {    //堆排序    public  static void heapSort(int[] array) {        if(array == null || array.length <=1 ) {            return;        }        int totalIndex = array.length-1;        buildHeap(array,totalIndex);        while(totalIndex > 0) {            swap(array,0,totalIndex);            if(--totalIndex == 0) {                break;            }            adjustHeap(array,0, totalIndex);        }    }    //根据数组建立堆    public static void buildHeap(int[] array,int totalIndex) {
  //注意这里i是从(totalIndex-1)/2-1开始的,因为我索引值是从0开始的。 for(int i=(totalIndex-1)/2-1; i>=0; i--) { adjustHeap(array,i, totalIndex); } } //调整堆 public static void adjustHeap(int[] array,int curIndex, int totalIndex) { int biggestIndex = curIndex; int leftIndex = 2*curIndex +1; int rightIndex = 2*curIndex +2; if(rightIndex <= totalIndex) { if(array[curIndex]
array[rightIndex] ? leftIndex : rightIndex; } } else if(leftIndex <= totalIndex ) { if(array[curIndex]

转载于:https://www.cnblogs.com/loren-Yang/p/7466116.html

你可能感兴趣的文章
数值积分中的辛普森方法及其误差估计
查看>>
Web service (一) 原理和项目开发实战
查看>>
跑带宽度多少合适_跑步机选购跑带要多宽,你的身体早就告诉你了
查看>>
深入理解Java的接口和抽象类
查看>>
Javascript异步数据的同步处理方法
查看>>
iis6 zencart1.39 伪静态规则
查看>>
SQL Server代理(3/12):代理警报和操作员
查看>>
Linux备份ifcfg-eth0文件导致的网络故障问题
查看>>
2018年尾总结——稳中成长
查看>>
JFreeChart开发_用JFreeChart增强JSP报表的用户体验
查看>>
度量时间差
查看>>
通过jsp请求Servlet来操作HBASE
查看>>
Shell编程基础
查看>>
Shell之Sed常用用法
查看>>
<气场>读书笔记
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
3D地图的定时高亮和点击事件(基于echarts)
查看>>
mysql开启binlog
查看>>
设置Eclipse编码方式
查看>>
分布式系统唯一ID生成方案汇总【转】
查看>>