Java实现堆排序

堆排序:
首先要满足:是一颗近似完全二叉树
大顶堆是父节点的值不小于子节点
小顶堆是父节点的值不大于子节点

大顶堆代码示例:
package sort;

import java.util.Arrays;

public class HeapSort {

    /**
     * 大顶堆
     * @param args
     */


    public static void main(String[] args) {

        int a [] = {4,1,6,3,5,67,6788,1,8788,5};

        heapsort(a);

        System.out.println(Arrays.toString(a));

    }

    public static void heapsort(int[] a) {

        int n = a.length;

        //将无序数组构建成大顶堆
        for (int i = (n-2)/2; i >=0; i--) {

            downAdjust(a,i,n);

        }

        for (int i = n-1; i >=0 ; i--) {

            int temp = a[i];

            a[i] = a[0];

            a[0] = temp;

            downAdjust(a,0,i);
        }



    }

    private static void downAdjust(int[] a, int i, int n) {

        int temp = a[i];

        int child  = 2*i+1;

        while (child<n){

            //当存在右孩子的时候,并且右孩子的值大于左孩子的时候

            if(child+1<n&&a[child+1]>a[child]){
                child++;
            }

            //当父节点大于任何一个孩子节点直接跳出

            if(temp>=a[child]){
                break;
            }

            a[i] = a[child];

            i = child;

            child = 2*child+1;
        }

        a[i] = temp;


    }
}

小顶堆代码示例:
package sort;

import java.util.Arrays;

public class HeapSort2 {

    /**
     * 小顶堆
     * @param args
     */


    public static void main(String[] args) {

        int a [] = {4,1,6,3,5,67,6788,1,8788,5};

        heapsort(a);

        System.out.println(Arrays.toString(a));

    }

    public static void heapsort(int[] a) {

        int n = a.length;

        //将无序数组构建成大顶堆
        for (int i = (n-2)/2; i >=0; i--) {

            downAdjust(a,i,n);

        }

        for (int i = n-1; i >=0 ; i--) {

            int temp = a[i];

            a[i] = a[0];

            a[0] = temp;

            downAdjust(a,0,i);
        }



    }

    private static void downAdjust(int[] a, int i, int n) {

        int temp = a[i];

        int child  = 2*i+1;

        while (child<n){

            //当存在右孩子的时候,并且右孩子的值大于左孩子的时候

            if(child+1<n&&a[child+1]<a[child]){
                child++;
            }

            //当父节点大于任何一个孩子节点直接跳出

            if(temp<=a[child]){
                break;
            }

            a[i] = a[child];

            i = child;

            child = 2*child+1;
        }

        a[i] = temp;


    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值