堆排序--Java实现

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]);
    }
}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值