一、大根堆: 子树的头是最大值。
    image.png
    二、给一个无序的数组,将整个数组变成
    a1>= a2<= a3 >= a4…的形式,要求空间复杂度O(1);
    三、
    image.png
    解法1、如果用插入排序,复杂度是K N
    解法2、移动距离不超过6,所以前7个数字里面的最小值一定是整体的最小值。求一个数的最小值朴素算法复杂度是n,但是如果用小根堆, 每一次只调整一个数,那么平均就变成了logN。
    比如k = 6,
    step1: 准备一个小根堆,先遍历前7个数,拍完序之后,最小值一定在头位置,
    step2 :然后删除头节点,调整小根堆,继续加入下一个数字,堆的大小永远是k+1, 所以总体复杂度是N
    log7
    step3: 剩下的依次弹出。
    tips:小根堆在java中是优先级队列。

    1. /**
    2. * @author 张伟-算法
    3. * @version 1.0
    4. * @date 2021/9/9 5:04 下午
    5. */
    6. public class T7_MinHeap {
    7. public static void main(String[] args) {
    8. int[] arr = {8,4,9,10};
    9. PriorityQueue<Integer> heap = new PriorityQueue<>();
    10. int k = 2;
    11. int cur = 0;
    12. for(int i = 0 ; i < arr.length; i ++ ){
    13. if(i <= k ){
    14. heap.add(arr[i]);
    15. }
    16. else {
    17. arr[cur++] = heap.poll();
    18. heap.add(arr[i]);
    19. }
    20. }
    21. while(heap.size()>0){
    22. arr[cur++] = heap.poll();
    23. }
    24. System.out.println(Arrays.toString(arr));
    25. }
    26. }

    左程云版本:
    image.png
    注意:左程云16-17行,他这里到达index位置的时候,第16行先加入heap,在进行poll,感觉应该倒过来。
    tips:
    1、堆结构用到的数组空间当耗尽的时候是会扩容的,如果是N的数据量,扩容次数为logN次,每次做数组拷贝,总时间复杂度是NlogN次,那么平均增加一条数据时间复杂度是N*logN / N ,还是Nimage.png
    2、系统提供的函数,是一个黑盒,对外只提供增加删除吗,如果做修改某一个元素的那么不能自动地进行调整。
    四、需要手写堆调整功能的题目。