算法题: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);
}