博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
堆排序(JAVA版)
阅读量:3556 次
发布时间:2019-05-20

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

堆排序原理就不解释了,大家可以自行查找,建议大家阅读《算法导论》第六章堆排序,很详细哦,在这里直接把源码贴出来。

如果大家想了解另外两种牛掰的排序算法,请猛戳下面链接

 

平均复杂度O(nlogn)

public class HeapSort {    public static int arr[] = {1,7,9,5,4,3,9,8,10,19,15,0,1};    //数组长度    public static int len = arr.length;    //堆中元素的有效元素 heapSize<=len    public static int heapSize = len;    public static void main(String[] args) {        heapSort();        print();    }    /**     * 堆排序     */    public static void heapSort(){        buildMaxHeap(); //构建大堆        for(int i = len-1;i>=1;i--){            int t = arr[i];            arr[i] = arr[0];            arr[0] = t;            heapSize--;            maxHeap(0);        }    }    /**     * 自底向上构建大堆     */    public static void buildMaxHeap(){        int size = len / 2;        for(int i = size;i>=0;i--){            maxHeap(i);        }    }    /**     * i节点为根及子树是一个大堆     * @param i     */    public static void maxHeap(int i){        int l = left(i);        int r = right(i);        int index = i;        if(l
arr[index]){ index = l; } if(r
arr[index]){ index = r; } if(index != i){ int t = arr[index]; arr[index] = arr[i]; arr[i] = t; //递归向下构建堆 maxHeap(index); } } /** * 返回i节点的左孩子 * @param i * @return */ public static int left(int i){ return 2*i; } /** * 返回i节点的右孩子 * @param i * @return */ public static int right(int i){ return 2*i+1; } /** * 打印 */ public static void print(){ for(int a:arr){ System.out.print(a+","); } System.out.println(); }

 

转载地址:http://gncrj.baihongyu.com/

你可能感兴趣的文章
[HDU] 平方和与立方和
查看>>
[HDU 2096] 小明A+B
查看>>
[HDU 2520] 我是菜鸟,我怕谁(不一样的for循环)
查看>>
[HDU 1215] 七夕节(求因子,不超时)
查看>>
[POJ 1915] Knight Moves
查看>>
Memcache技术精华
查看>>
Redis详解入门篇
查看>>
php开启redis扩展包与redis安装
查看>>
php使用openssl来实现非对称加密
查看>>
pdo如何防止 sql注入
查看>>
myisam和innodb的区别
查看>>
MySQL建表规范与注意事项(个人精华)
查看>>
JDK8接口的新特性
查看>>
synchronized的局限性与lock的好处
查看>>
redis和memcached有什么区别?
查看>>
Spring中的设计模式
查看>>
如何设计一个秒杀系统 -- 架构原则
查看>>
如何设计一个秒杀系统 -- 动静分离方案
查看>>
JWT 快速了解
查看>>
实习日志一
查看>>