堆排序--Java实现
2016-03-11 00:49
363 查看
package com.shusheng.heapSort;
/**
* 实现堆排序
* @author Administrator
*
*/
public class HeapSort {
}
/**
* 实现堆排序
* @author Administrator
*
*/
public class HeapSort {
/** * 堆排序算法 * @param data */ public static void heapSort(int[] data){ //将数组构建成大顶堆 //通过作图可以发现data.length/2刚刚好是最后一个有叶子的节点,i代表父节点(i==1时才是根节点), //构造大顶堆时先从最后一个有叶子的节点开始排序,然后一直往根节点排,请画图 for (int i = data.length/2; i >0; i--) { maxHeapify(data, i, data.length);//该方法只排序那些以i为父节点的部分二叉树。 } //第一次进入下面的for循环时,还是一个大顶堆,所以根节点最大,根据堆排序原则,将根节点和最后一个节点换位置, //换完为止后,将换了之后的那个堆调整为大顶堆,但是最后一个节点已经是有序了, //所以maxHeapify(data,1,i-1);的i-1表示堆的大小减1,避免最后一个节点再参加排序 //循环,每次把根节点和堆中的最后一个节点调换位置 for (int i = data.length; i >1; i--) { int temp = data[0]; data[0] = data[i-1]; data[i-1] = temp; //堆的长度减少1,排除置换到最后位置的根节点 maxHeapify(data,1,i-1); } } /**该函数的作用是传入一个父节点(该节点不一定是根节点),当该节点在比所有孩子都大时,就不做调整,否则就会做调整,并且还会检查子节点的情况是否是最大。 * 堆调整,使父节点变成孩子中最大 * @param data 数组 * @param parentNodeIndex 父节点 * @param heapSize 堆大小 */ private static void maxHeapify(int[] data, int parentNodeIndex, int heapSize) { //左子节点索引 int leftChildNodeIndex = parentNodeIndex*2; //右子节点索引 int rightChildNodeIndex = parentNodeIndex*2+1; //最大节点索引 int largestNodeIndex = parentNodeIndex; //左节点大于父节点,先让一个最大指针指向该节点,因为还不知道这三个节点是否这个最大,所以还不必交换 if(leftChildNodeIndex<=heapSize&&data[leftChildNodeIndex-1]>data[largestNodeIndex-1]){ largestNodeIndex = leftChildNodeIndex; } //右节点大于最大节点,先让一个最大指针指向该节点,虽然知道了这个节点可能是最大,但还是统一处理较好 if(rightChildNodeIndex<=heapSize&&data[rightChildNodeIndex-1]>data[largestNodeIndex-1]){ largestNodeIndex = rightChildNodeIndex; } //如果父节点和最大节点索引不相等,说明最大节点有变动,交换两个节点的值使得父节点最大 if(largestNodeIndex!=parentNodeIndex){ int temp = data[parentNodeIndex-1]; data[parentNodeIndex-1] = data[largestNodeIndex-1]; data[largestNodeIndex-1] = temp; //交换了节点后,可能子节点也会变动,所以递归检查经过调整的子节点是否也是大顶堆,此时的largestNodeIndex不是指向父节点, //而是指向没调整前的那个最大节点位置,因为只有那个节点和父节点交换了,所以只需要检查largestNodeIndex和孩子是否需要调整。 maxHeapify(data,largestNodeIndex, heapSize); } } public static void main(String[] args) { int[] args1 = {62,59,7,155,440,71,12,44}; heapSort(args1); for (int i = 0; i < args1.length; i++) { System.out.println(args1[i]); } }
}
相关文章推荐
- struts2的执行流程
- JavaWeb学习(四):JavaBean
- Java static关键字使用小结
- JAVA工程师成神之路
- ubuntu下安装、配置JDK8
- 【图】解类似MyEclipse查看原始类出现”The JAR file dom4j-1.6.1jar has no source attachment”的问题
- 冒泡排序--Java实现
- Java入门 之深入浅出吧
- java中静态代码块的用法 static用法详解和static静态导入
- [Java开发之路](20)try-with-resource 异常声明
- spring aop 基于xml配置版
- 1.java开篇
- Struts 1或2 ActionForm接受不到页面传值的问题
- 单点登录研究一
- JavaWeb学习(二):Servlet
- JavaWeb学习(三):jsp
- JavaWeb学习(一):Servlet
- RxJava学习历程(二)
- java基础
- Spring中ref