堆排序

这里写图片描述

    /**
     * 堆排序:稳定排序
     * 核心思想:
     *  1.构造二叉树,根最大;
     *  2.拿出来后,放到数组最末位置。
     *  3.继续构造大堆(数量到倒数第二个);
     *  4.依次循环,直到所有的排好序
     *  
     *  优点:比较时只用遍历一半
     * @param array
     */
    public void HeapSort(int []  array) {
        if(array == null || array.length ==0) {
            return;
        }
        //创建大堆
        buildMaxHeap(array);
        //从大到小是,从最边子树建到根,反之,可以自己考虑;
        for(int i = array.length -1;i>=1;i--) {
            //最大的元素排到了 下标 为 0 的位置
            exchangeElements(array, 0, i);
            maxHeap(array,i,0);
        }
    }
    /**
     * 
     * @param array
     */
    private void buildMaxHeap(int[] array) {
        int half = (array.length-1)/2;//假设长度为9,只需遍历01234
        for(int i =half; i>=0 ; i--) {
            //构造大堆
            maxHeap(array,array.length,i);
        }
    }
    /**
     * 
     * @param array 数组
     * @param length 数组长度
     * @param i  开始的位置
     */
    private void maxHeap(int[] array, int length, int i) {
        int left = 2*i +1;
        int right = 2*i +2;
        //初始化:最大值的下标为根元素下标
        int largest = i;
        //根元素与左子树值比较,记录最大值的下标
        if(left<length && array[left]>array[largest]) {
            largest = left;
        }
        //根元素与右子树值比较,记录最大值的下标
        if(right <length && array[right]>array[largest]) {
            largest = right;
        }
        //最大值的下标与初始化值不同
        if(i != largest) {
            //交换元素位置,较大的元素为父节点
            exchangeElements(array,i,largest);
            //交换元素,重新构造大堆
            maxHeap(array, length, largest);
        }
    }
    /**
     * 
     * @param array 数组
     * @param i  交换的元素
     * @param largest 交换的元素
     */
    private void exchangeElements(int[] array, int i, int largest) {
        int  temp = array[i];
        array[i] = array[largest];
        array[largest] = temp ;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值