【数据结构与算法】04(java)堆、堆排序、比较器

本文详细介绍了堆结构,包括完全二叉树、大根堆与小根堆的概念,以及堆的插入、调整等操作。讨论了堆排序的原理和优化,并展示了Java内置的堆调用。此外,文章还探讨了比较器在特殊排序需求中的作用,以及如何使用比较器进行范型编程。最后,给出了相关代码示例和排序结果。
摘要由CSDN通过智能技术生成

堆结构
1)堆结构就是用数组实现的完全二叉树结构
2)完全二叉树中如果每棵子树的最大值都在顶部就是大根堆
3)完全二叉树中如果每棵子树的最小值都在顶部就是小根堆
4)堆结构的heaplnsert与heapify操作
5)堆结构的增大和减少
6)优先级队列结构,就是堆结构.

i(i下标从0开始,根节点)的左孩子在数组中2i+1位置上,右孩子在2i+2位置上,i的父节点在(i-1)/2取整位置。(完全二叉树)
大根堆:每棵子树的根节点最大
小根堆:每棵子树的根节点最小

package com.algorithm;

public class Heap01 {
   

    public static class MyMaxHeap {
   
        private int[] heap;
        private int limit;
        private int heapSize;//堆中元素的长度,已经收集了多少元素

        private MyMaxHeap(int limit) {
   
            heap = new int[limit];//数组实现堆
            this.limit = limit;
            heapSize = 0;
        }

        public boolean isEmpty() {
   
            return heapSize == 0;
        }

        public boolean isFull() {
   
            return heapSize == limit;
        }

        //建立大根堆,每次加入一个数,使完全二叉树保持大根堆
        public void push(int value) {
   
            if (heapSize == limit) {
   
                throw new RuntimeException("heap is full");
            }
            heap[heapSize] = value;//每次把新元素放到堆尾,与父节点作比较,上浮到合适位置
            //value放在heapsize位置上
            heapInsert(heap, heapSize++);
        }

        //index位置上是我刚放在堆尾的元素
        private void heapInsert(int[] arr, int index) {
   
            //停:arr[index]不比arr[index父]大了
            // 停:index已经到0位置了,堆顶部
            while (arr[index] > arr[(index - 1) / 2]) {
   //该节点比父父节点大
                swap(arr, index, (index - 1) / 2);
                index = (index - 1) / 2;//上冒
            }
        }

        //冒出最大元素,调整剩余元素仍为大根堆
        //用户此时,让你返回最大值,并且在大根堆中,把最大值删掉
        //剩下的数,依然保持大根堆
        public int pop() {
   
            int ans = heap[0];
            swap(heap, 0, --heapSize);//堆的大小减一
            heapify(heap, 0, heapSize);
            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值