数据结构和算法——二叉树应用之堆排序

1、预备知识

  • 利用大顶堆进行升序排序
    不多说,先看看大顶堆长什么鸟样
    特征就是对于每一个局部二叉树,父节点总是大于左右子节点,左右节点的大小没有关系。
    小顶堆同理。
    在这里插入图片描述

  • 二叉树和数组的关系:上面的二叉树可以转换成相应的数组是[90,80,70,60,50,60,20,10],具体怎么转化,苦于自身口技,大家就自己查资料吧

2、开始排序

2.1、基本思想:

对于算法,思想才是精髓。
1)将待排序的数组构造成大顶堆,整个序列的最大值就是堆顶;
2)将堆顶元素与序列的末尾元素进行交换,此时末尾为最大值,其不参与后面的排序;
3)将剩余的n-1个元素狗造成一个大顶堆,这样就得到了次小值,反复2,3操作,便可得到一个升序序列;

2.2、调整局部二叉树

对 下表为1的根节点进行调整

调整根节点为1的局部二叉树
对应的代码

/**
     * 对局部二叉树进行调整
     * @param arr
     * @param i
     * @param len
     */
    public static void adjustHeap(int[] arr, int i, int len){

        int temp = arr[i];
        for (int j = 2*i+1; j < len ; j = j*2+1) {
//            右子树不能越界
            if (j+1 < len && arr[j] < arr[j+1]) {
                j++;
            }
            //交换父节点和叶子节点
            if (arr[j] > temp){
                arr[i] = arr[j];
                i = j;
            }else {
                break;
            }
        }
        arr[i] = temp;
    }

2.2、构建大顶堆和进行排序


	//1)将待排序的数组构造成大顶堆,整个序列的最大值就是堆顶;
	//2)将堆顶元素与序列的末尾元素进行交换,此时末尾为最大值,其不参与后面的排序;
	//3)将剩余的n-1个元素狗造成一个大顶堆,这样就得到了次小值,反复2,3操作,便可得到一个升序序列;
public static void heapSort(int[] arr){
        int temp = 0;
        //调用上面的方法,调整为大顶堆
        for (int i = arr.length/2-1 ; i >= 0; i--) {
            adjustHeap(arr,i,arr.length);
        }
		
        for (int j = arr.length-1; j > 0 ; j--) {
            temp = arr[j];
            arr[j] = arr[0];
            arr[0] = temp;
            adjustHeap(arr,0,j);
        }
    }

测试结果

		int[] arr = {4,6,8,5,9,35,56,3,2};
        System.out.println("原始数组:"+Arrays.toString(arr));
        heapSort(arr);
        System.out.println("排序后数组:"+Arrays.toString(arr));

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值