堆和优先级队列(Java)

1. 什么是堆?

堆是树的一种形式,不同之处在于树上的结点可以随便,堆可以分为大堆和小堆,
大堆:父结点的值一定大于两个子节点。
小堆:父节点的值一定小于两个字结点。

2.堆的内存方式?

数组

3.堆的实现

小堆:

//对任意位置的结点进行调整(向下调整)
public static void adjustDown(int[] array, int size, int index) {
        while (true) {
            // 1. 判断 index 是不是叶子
            int leftIndex = 2 * index + 1;
            if (leftIndex >= size) {
                return;
            }


            // 2. 找最小的孩子
            int minIndex = leftIndex;
            int rightIndex = leftIndex + 1;
            if (rightIndex < size && array[rightIndex] < array[leftIndex]) {
                minIndex = rightIndex;
            }

            // 3. 比较最小孩子的值 和 index 位置的值
            if (array[index] <= array[minIndex]) {
                return;
            }

            // 4. 交换
            int t = array[index];
            array[index] = array[minIndex];
            array[minIndex] = t;

            // 5. 把最小的孩子视为 index,继续循环
            index = minIndex;
        }
    }
//建堆
public static void createHeap(int[] array, int size) {
     //寻找最小的非叶子结点;
     int leftIndex = (size-1-1)/2; 
     //循环把每个数进行入堆
     for(int i = leftIndex;i> = 0;i--) {
        adjustDown(array,size,i)
     }
}
//向上调整(任意位置)
public static void adjustUp(int[] array, int size, int index) {
//不是父结点一直循环(循环终止条件)
     while(index != 0) {
         //找父结点
         int indexParent = (index-1)/2;
         //判断父节点和子节点的大小
         if(array[indexParent] > array[index]) {
              return;
         }
         //交换
         int temp = array[index];
         array[index] = array[indexParent];
         array[patent] = temp;
         //将父结点看作index继续循环
         index = indexParent;
     }
}

大堆:

public void up(int[] array,int size,int index) {
        int leftIndex = index*2 + 1;
        if(leftIndex > size) {
            return;
        }

        int maxIndex = leftIndex;
        int rightIndex = leftIndex + 1;
        if(rightIndex < size && array[rightIndex] > array[leftIndex]) {
            maxIndex = rightIndex;
        }

        if(array[maxIndex] < array[index]) {
            maxIndex = index;
        }

        int temp = array[index];
        array[index] = array[maxIndex];
        array[maxIndex] = temp;

        index = maxIndex;
    }
    public void setHeap(int[] array,int size) {
        int index = size - 1;
        int lastParentIndex = (index-1)/2;
        for (int i = lastParentIndex;i >= 0 ; i++) {
            up(array,size,i);
        }
    }

    public void ajustUp(int[] array,int size,int index) {
        while (index != 0 ) {
            int indexParent = (index - 1)/2;

            if(array[indexParent] < array[index]) {
                break;
            }

            int temp = array[index];
            array[index] = array[indexParent];
            array[indexParent] = temp;

            index = indexParent;
        }
    }

4.java的堆:

//有限队列本质就是小堆
Queue<Integer> priorityQueue = new PriorityQueue<>();

5.利用优先队列实现大堆

Queue<Integer> priorityQueue = new PriorityQueue<>((o1,o2) -> o2-o1);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值