【每日面经4.2】鸡蛋掉落,堆排序

本文探讨了经典的鸡蛋掉落问题,提出使用二分查找策略进行优化,并详细介绍了堆排序算法的实现过程,包括堆化、建立堆和输出堆的步骤。通过实例代码展示了如何在Java中应用堆排序方法解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法题:lc887. 鸡蛋掉落

面试时会问你如果是两个鸡蛋100层楼会怎样?建议按照以下顺序回顾一下:1.李永乐讲双蛋问题2.这一部分是官方针对挑选楼层穷举的优化:二分查找

堆排序

可以没事去牛客上敲一敲排序算法:https://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896?tpId=117&tqId=37851&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3Ftab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D117&difficulty=undefined&judgeStatus=undefined&tags=&title=
堆排序的讲解可以参考:https://www.bilibili.com/video/BV1Eb41147dK?spm_id_from=333.337.search-card.all.click
堆得定义(一般建立的堆都是大顶堆这样输出是从小到大排列的)
在这里插入图片描述
对于堆通常使用数组保存整个二叉树。用数组保存的二叉树满足如下关系
在这里插入图片描述

建立堆排序的第一步:编写堆化方法

与子节点中最大值交换
被交换后接着判断是否满足堆定义,不满足接着与最大值交换。
在这里插入图片描述
在这里插入图片描述

static void heapify(int[] array ,int n ,  int k){//递归堆化
        if(k >= n)return;
            int c1 = 2 * k + 1;
            int c2 = 2 * k + 2;
            int max_index = k;
            if(c1 < n && array[max_index] < array[c1])max_index = c1;
            if(c2 < n && array[max_index] < array[c2])max_index = c2;
            if(max_index != k){
                int tmp = array[k];
                array[k] = array[max_index];
                array[max_index] = tmp;
                heapify(array ,n, max_index);
            }
        }

第二部建立堆:build——heap

static void build_heap(int[] array ,int n){//准备工作:将数组堆化
        int parent = (n - 1 - 1)/2;
        for(int i = parent ; i >= 0 ; i--){//从下面往上循环
            heapify(array ,n, i);
        }
    }

第三步:输出堆(减小堆节点的数量,这意味着之前的函数都要有一个记录数量的值n)

static void heap_sort(int[] array){
        build_heap(array , array.length);
        for(int i = array.length - 1 ; i >=0 ;i--){//i表示当前堆的数量
            int tmp = array[0];//交换头部与堆的末尾
            array[0] = array[i];
            array[i] = tmp;
            heapify(array , i , 0);//仅仅只有头部不满足大堆,直接堆化即可
        }
    }

main方法:

public static void main(String[] args) {
        int[] array = MakeArray.getDefaultArray();
        heap_sort(array);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值