您的位置:首页 > 编程语言 > Java开发

堆排序--Java实现

2016-03-11 00:49 363 查看
package com.shusheng.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]);
}
}


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: