实现堆排序的算法思路是先创建堆,也就是从叶子节点起对每一层的孩子节点及其对应位置的父亲节点进行比较,较大的孩子节点替换较小的父亲节点,一级一级比较替换,就创建出了大根堆,小根堆反之。创建好大根堆以后,我们,将整棵树的根节点与最后最后一个节点替换位置,然后去除最后一个节点,在创建一个新的大根堆,以此类推,完成排序。代码如下:

/**
* <p>堆排序
* @param int[] arr
* @return int[]
* */
public int[] heapSort(int[] arr){

arr=creatHeap(arr,arr.length-1);//初始化大根堆
//每次替换大根到对应最后位置,有后往前排序
for(int i=arr.length-1;i>0;i--){
int temp=arr[i];
arr[i]=arr[0];
arr[0]=temp;
creatHeap(arr,i-1);//对去除根的数组再次排序为大根堆
}
return arr;
}

/**

		 * <p>堆创建算法
* @param int[] arr
* @return int[]
* */
public int[] creatHeap(int[] arr,int length){
System.out.println("建立大根堆:");
for(int i=length;i>0;i--){
int root=i;
int j=(root-1)/2;
/*叶子节点和上一层的根比较*/
while(root>0){
if(arr[root]>arr[j]){
int temp=arr[j];
arr[j]=arr[root];
arr[root]=temp; }
/*改变位置,比较上一层与其父层节点*/
root=j;
j=(root-1)/2; }
}
for(int i=0;i<arr.length;i++){
System.out.print(" arr["+i+"]="+arr[i]);
}
System.out.println("");
return arr;
}

java堆排序(大根堆)的更多相关文章

  1. Java实现堆排序(大根堆)

    堆排序是一种树形选择排序方法,它的特点是:在排序的过程中,将array[0,...,n-1]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲节点和孩子结点之间的内在关系,在当前无序区中选择关键 ...

  2. 215. 数组中的第K个最大元素 + 快速排序 + 大根堆

    215. 数组中的第K个最大元素 LeetCode-215 另一道类似的第k大元素问题:https://www.cnblogs.com/GarrettWale/p/14386862.html 题目详情 ...

  3. java实现最小堆

    1.堆:通常通过二叉堆,实为二叉树的一种,分为最小堆和最大堆,具有以下性质: 任意节点小于它的所有后裔,最小元在堆的根上. 堆总是一棵完全树 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小 ...

  4. 实战Java虚拟机之一“堆溢出处理”

    从今天开始,我会发5个关于java虚拟机的小系列: 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四 ...

  5. java中的堆、栈、常量池

    java中的堆.栈.常量池 分类: java2010-01-15 03:03 4248人阅读 评论(5) 收藏 举报 javastring编译器jvm存储equals Java内存分配: 1. 寄存器 ...

  6. java栈内存堆内存和GC相关

    java栈内存堆内存 Java把内存分成两种,一种叫做栈内存,一种叫做堆内存,有着不同的作用.栈内存用来存储局部变量和方法调用.栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属 ...

  7. (转)Java里的堆(heap)栈(stack)和方法区(method)(精华帖,多读读)

    [color=red][/color]<一> 基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收.   引用数据类型,需要用new来创建,既在栈 ...

  8. bzoj4919 [Lydsy1706月赛]大根堆

    Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...

  9. bzoj 4919: [Lydsy六月月赛]大根堆

    Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...

随机推荐

  1. 关于HashSet在 java7 与 java8的不同

    作者:RednaxelaFX链接:https://www.zhihu.com/question/28414001/answer/40733996来源:知乎著作权归作者所有.商业转载请联系作者获得授权, ...

  2. Python可视化Matplotlib-K线图

    引入类库 import matplotlib as mpl import tushare as ts import matplotlib.pyplot as plt import matplotlib ...

  3. 搭建wordpress

    https://www.themepark.com.cn/xcjxgwordpressdzdyglyd.html

  4. Django1.6 运行manage.py 报错解决办法(ImportError)

    django项目中运行manage.py python manage.py runserver 出现如下错误提示: Traceback (most recent call last): File &q ...

  5. Loki之ThreadPool

    Loki中的ThreadPool目的主要是对创建出来的线程进行复用. ThreadPool在Test而非Loki目录下,因此并非是标准Loki的组件之一,不过我们可以对其修改定制, 下面是对其源码的大 ...

  6. CMDB实现的四种方式

    第一种(agent): 这种方式是通过向每一台服务器安装agent脚本,然后通过中控机的API,来收集所需要的数据,最后放到数据库中,在通过web的方式显示出来. 实现流程图: 1.录入资产(主机名, ...

  7. rest_framework 之版本控制

    一 作用 用于版本的控制 二 内置的版本控制类 from rest_framework.versioning import QueryParameterVersioning,AcceptHeaderV ...

  8. 缓存系统MemCached的Java客户端优化历程

    Memcached 是什么? Memcached是一种集中式Cache,支持分布式横向扩展.这里需要解释说明一下,很多开发者觉得Memcached是一种分布式缓存系统,但是其实Memcached服务端 ...

  9. MongoDB主从复制+集群

    一.读写分离的概念 读写分离,基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE),而从数据库处理SELECT查询操作.数据库复制被用来把事务性操作导致的变更同步 ...

  10. Ubuntu解压命令全览

    1. Ubuntu解压命令全览.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName 注:tar是打包,不是压缩! .gz 解压1:g ...