堆的向上调整、向下调整(堆化)

数据结构上的堆在物理上是一个数组,在逻辑上是一个二叉树。
大堆:根结点比孩子结点大;
小堆:根结点比孩子结点小;
堆化(向下调整)、向上调整的前提都是:在二叉树中,只有一个位置不满足堆的性质,其它位置都满足堆的性质。
向下调整 是让调整的结点与其孩子节点进行比较
向上调整 是让调整的结点与其父亲结点进行比较
已知双亲的下标,则左孩子的下标为:left=2parent+1;
则右孩子的下标为:left=2
parent+2;
已知孩子结点(不区分左右)的下标,则双亲的下标为:(child-1)/2;

向下调整

//堆化为大堆
    //堆化(向下调整)  前提是 只有一个地方不满足堆的性质,其他位置都满足堆的性质
    private static void heapify(int[] array,int index){
        //看该节点是不是叶子结点
        //其左孩子节点下标
       int max=2*index+1;
       //如果左孩子下标超过数组长度,则该结点是叶子结点
       if(max>=array.length){
           return;

       }
       //找出孩子结点中值最大的结点下标
       if(max+1<array.length&&array[max+1]>array[max]){
           max=max+1;

       }

       //比较该根结点与最大的孩子结点的大小,如果孩子结点大,则换位置
        if(array[index]<array[max]){
           int t=array[index];
           array[index]=array[max];
           array[max]=t;
           //换完之后,在该index结点处满足堆的性质了,
           //但是在max位置,其与它的孩子结点不一定满足堆的性质了,在max位置继续进行堆化
           heapify(array,max);

        }

    }
 public static void main(String[] args) {

        int[] array = new int[]{14, 10, 9, 7, 12, 2, 1, 4, 3, 11, 5};

        heapify(array, 1);
        System.out.println(Arrays.toString(array));

    }

结果为:在这里插入图片描述
向上调整:

 private static void adjustUp(int[] array,int index){

        //向上调整到下标为0的位置就不调整了
        if(index==0){
            return;

        }
        //其父亲结点
        int parent=(index-1)/2;

        //与父亲结点相比较
        //如果父亲节点的值小,就交换位置,否则就不调整了
        if(array[parent]<array[index]){
            int t=array[parent];
            array[parent]=array[index];
            array[index]=t;

            //继续向上调整
            adjustUp(array,parent);
        }
    }

 public static void main(String[] args) {
        int[] array1=new int[]{11,10,9,7,12,2,1,4,3,0,5};
        adjustUp(array1,4);

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

    }

结果为在这里插入图片描述

排序是一种基于数据结构的排序算法,其中包括向下调整向上调整两个关键步骤。 1. 向下调整(AdjustDown):在排序中,向下调整用于将一个元素下沉到合适的位置,以维持的性质。具体步骤如下: - 首先,将当前节点标记为根节点。 - 比较根节点与其左右子节点的值,找到最大(或最小)的节点。 - 如果根节点的值小于(或大于)最大(或最小)的子节点的值,则交换根节点与最大(或最小)子节点的值。 - 将当前节点更新为最大(或最小)子节点的位置,并重复上述步骤,直到当前节点不再有子节点或满足的性质。 2. 向上调整(AdjustUp):在排序中,向上调整用于将一个元素上浮到合适的位置,以维持的性质。具体步骤如下: - 首先,将当前节点标记为叶子节点。 - 比较叶子节点与其父节点的值,如果叶子节点的值大于(或小于)父节点的值,则交换叶子节点与父节点的值。 - 将当前节点更新为父节点的位置,并重复上述步骤,直到当前节点不再有父节点或满足的性质。 以下是一个示例代码,演示了排序中的向下调整向上调整的过程: ```python def adjust_down(arr, n, i): largest = i left = 2 * i + 1 right = 2 * i + 2 if left < n and arr[i] < arr[left]: largest = left if right < n and arr[largest] < arr[right]: largest = right if largest != i: arr[i], arr[largest] = arr[largest], arr[i] adjust_down(arr, n, largest) def adjust_up(arr, i): parent = (i - 1) // 2 if parent >= 0 and arr[parent] < arr[i]: arr[parent], arr[i] = arr[i], arr[parent] adjust_up(arr, parent) # 示例数据 arr = [4, 10, 3, 5, 1] n = len(arr) # 向下调整示例 adjust_down(arr, n, 0) print("向下调整后的结果:", arr) # 输出:[10, 5, 3, 4, 1] # 向上调整示例 arr.append(7) n += 1 adjust_up(arr, n-1) print("向上调整后的结果:", arr) # 输出:[10, 7, 3, 5, 1, 4] ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值