看完你必须会的堆排序!!!

1·小铺垫

首先我们需要了解两个词,大顶堆,小顶堆,我们借用个图来表示

大顶堆的节点会比自己的子节点要大,小顶堆的节点要比自己的子节点要小;

用表达式就是:

大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] 

小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2] 

2·堆排序讲解

我们主要是利用了大顶堆升序排列了数组,排序过程只需要干两件事情:

1·构建大顶堆

2·将堆顶元素和数组末尾元素交换

代码实现:

import java.util.Arrays;

/**堆排序
 * @author JYT
 * @date 2021年08月16日 23:17
 */
public class HeapSort {

    public static void main(String[] args) {
        int[] arr = new int[]{1,4,2,22,3,5};

       heap(arr);

    }
    
    public static void heap(int[] arr ){
        for(int i=arr.length/2-1;i>=0;i--){
            adjustHeap(arr,i,arr.length);
        }
        //堆顶元素和数组末尾元素进行互换位置
        for(int j=arr.length-1;j>0;j--){
            int temp =  arr[0];
            arr[0] =  arr[j] ;
            arr[j] =  temp;
            //继续从上到下构建大顶堆
            adjustHeap(arr,0,j);
        }
        System.out.println(Arrays.toString(arr));

    }

    //构造大顶堆
    public static void adjustHeap(int[] arr ,int parent,int length){
        int temp = arr[parent];
        int lChild = 2*parent + 1 ;
        while(lChild<length){
            int rChild = lChild + 1;
            if(rChild<length && arr[rChild]>arr[lChild]){
                lChild++;
            }
            if(temp>arr[lChild]){
                break;
            }
            //把孩子的值给父亲节点
            arr[parent] = arr[lChild] ;
            //把孩子的索引给父亲节点 便于向下继续筛选;
            parent = lChild ;
            //孩子的节点继续向下探索
            lChild = 2*lChild +1 ;
        }
        //把原来父亲节点的值给到现在父亲节点的值,也就是向下传递了
        arr[parent] = temp ;
    }



}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

苏然HHash#

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

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

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

打赏作者

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

抵扣说明:

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

余额充值