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

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

hot3.png

这里的“堆”和Java中的堆并不是一个概念

堆排序中的“堆”实际上是一个“排列成数组的完全二叉树”,或者说把一个数组展开,当成完全二叉树来看。

即在对数组进行排序时,把数组当做一个“完全二叉树”进行操作,实现排序。

package com.company;/** * Created by pierr on 2017/3/25. * 堆排序 */public class HeapSort {    public int[] heapSort(int[] arr){        HeapArray heapArray = new HeapArray();        heapArray.setArr(arr);        heapArray.setHeapSize(arr.length);        //构建最大堆        buildMaxHeap(heapArray);        for (int i = arr.length-1 ; i>0 ; i--) {            int temp = arr[0];            arr[0] = arr[i];            arr[i] = temp;            heapArray.setHeapSize(heapArray.getHeapSize()-1);            makeMaxHeap(heapArray,0);        }        return heapArray.getArr();    }    /**     * 构建最大堆     * @param heapArray     */    private void buildMaxHeap(HeapArray heapArray){        for (int i = heapArray.getArr().length/2 - 1; i >= 0 ; i--) {            makeMaxHeap(heapArray,i);        }    }    /**     * 将输入的下标和其左右子树中的最小值,移动到比其小的子树的根结点处     * @param heapArray     */    private void makeMaxHeap(HeapArray heapArray,int i){        //左孩子下标,2i        int left = (i<<1)+1;        //右孩子下标2i+1,注意位操作优先级比+要低        int right = (i<<1)+2;        //存储当前考虑的树的size        int heapSize = heapArray.getHeapSize();        //数组对象        int[] arr = heapArray.getArr();        //存储三个数中最大的一个的下标        int largest = i;        if (left
arr[i]){ largest = left; } if (right
arr[largest]){ largest = right; } //如果父节点不是最大的 if (largest!=i){ //交换 int temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; //继续将父节点处的数"下移" makeMaxHeap(heapArray,largest); } }}/** * 堆结构 */class HeapArray{ //组成堆的数组 private int[] arr; //堆的size private int heapSize; public int[] getArr() { return arr; } public void setArr(int[] arr) { this.arr = arr; } public int getHeapSize() { return heapSize; } public void setHeapSize(int heapSize) { this.heapSize = heapSize; }}

 

转载于:https://my.oschina.net/pierrecai/blog/867760

你可能感兴趣的文章
springcloud使用zookeeper作为config的配置中心
查看>>
校园火灾Focue-2---》洗手间的一套-》电梯
查看>>
bzoj1913
查看>>
L104
查看>>
分镜头脚本
查看>>
链表基本操作的实现(转)
查看>>
邮件发送1
查看>>
[转] libcurl异步方式使用总结(附流程图)
查看>>
编译安装LNMP
查看>>
[转]基于display:table的CSS布局
查看>>
crm 02--->讲师页面及逻辑
查看>>
AS3.0 Bitmap类实现图片3D旋转效果
查看>>
Eigen ,MKL和 matlab 矩阵乘法速度比较
查看>>
带三角的面包屑导航栏(新增递增数字)
查看>>
Web应用程序安全与风险
查看>>
codeforces 984 A. Game
查看>>
CSS居中
查看>>
One Person Game(概率+数学)
查看>>
CodeForces 258B Little Elephant and Elections :于1-m中找出七个数,使六个数里面的4和7个数比第七个数严格小:数位dp+dfs...
查看>>
MAP
查看>>