(兔C残篇)数组的堆排序学习笔记

堆排序是利用堆数据结构设计的一种排序算法,堆排序也是一种选择排序。
堆排序的思想是:

  1. 将待排序列构造成一个大顶堆,此时,整个序列整个序列的最大值就是大顶堆的根节点
  2. 将其与末尾元素进行交换,此时末尾就为最大值
  3. 然后将剩余n-1个元素重新构成一个堆,这样会得到n个元素的最小值
  4. 如此反复执行,便能得到一个有序的序列

在这里插入图片描述

//CODE实现过程

import java.util.Arrays;

public class ArrayResult {
    public static void main(String[] args) {
        //定义一个数组
        int arr[] = {1,0,6,7,2,3,4,};

        //调用调成大顶锥的方法
        //定义开始调整的位置
        int startIndex = (arr.length-1)/2;
        //循环开始调整
        for (int i =startIndex; i>=0; i--){
            toMaxHeap(arr,arr.length,i);
        }

        //打印数组,看其是否调整成大顶锥结构
        //System.out.println(Arrays.toString(arr)); //7,2,6,0,1,3,4

        //经过上述操作之后,已经将数组调整成了一个大顶锥,
        //然后还需要把根元素与最后一个元素进行调换
        for (int i = arr.length-1; i>0; i--){
            //循环中进行调换操作
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;
            //还完之后,再把剩余元素调成大顶锥
            toMaxHeap(arr,i,0);
        }
        System.out.println("打印最后的排序结果:"+Arrays.toString(arr));
        //最后结果为正确的升序排序
    }

    /**
     * 定义大顶锥结构的方法
     * @param arr 需要调整成大顶锥结构的数组
     * @param size 需要调整的元素个数
     * @param index 需要调整的元素开始位置
     */
    private static void toMaxHeap(int[] arr, int size, int index) {
        //获取左右字节的索引
        int leftNodeIndex = index *2+1;
        int rightNodeIndex = index *2+2;

        //查找到最大节点所对应的索引下标
        int maxIndex = index;

        //然后同左右节点进行比较
        //由于下面进行了递归调用,所以需要设置边界值,不然会出现ArrayIndexOutOfBoundsException
        if (leftNodeIndex<size && arr[leftNodeIndex] > arr[maxIndex]){
            maxIndex = leftNodeIndex;
        }
        if (rightNodeIndex<size && arr[rightNodeIndex] > arr[maxIndex]){
            maxIndex = rightNodeIndex;
        }

        //进行位置的调换
        if (maxIndex != index){
            int temp = arr[maxIndex];
            arr[maxIndex] = arr[index];
            arr[index] = temp;
            //调换完成之后,可能会影响到下面的子树不是大顶锥结构
            //递归调用,再次进行调换
            toMaxHeap(arr,size,maxIndex);
        }

        //这里完成了,完全二叉树调整成大顶锥的结构
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兔C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值