大根堆的实现和堆排序

//交换
public static void swap(int[] arr , int i , int j){
    arr[i] =arr[i] ^arr[j];
    arr[j] =arr[i] ^arr[j];
    arr[i] =arr[i] ^arr[j];
}
//大根堆
public static class MyMaxHeap{
    private int[] heap;
    private final int limit;
    private int heapSize;

    public 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;
        heapInsert(heap ,  heapSize++);
    }
    //返回最大值并使删去最大值的数组依然为大根堆
    public int pop(){
        int ans  = heap[0];
        swap(heap ,0 , --heapSize);
        heapify(heap , 0 ,heapSize);
        return ans;
    }
    //插入数据
    private void heapInsert(int[] arr , int index){
        while(arr[index]  >  arr[(index-1)/2]){
            swap(arr , index  ,(index-1)/2);
            index =  (index -1)/2;
        }
    }
    //堆排序
    public void heapSort(int[] arr){
        if (arr == null || arr.length < 2) {
            return;
        }
        for (int i = arr.length - 1; i >= 0; i--) {
            heapify(arr, i, arr.length);
        }
        int heapSize = arr.length;
        swap(arr, 0, --heapSize);
        while (heapSize > 0) {
            heapify(arr, 0, heapSize);
            swap(arr, 0, --heapSize);
        }
    }
    
    private void heapify(int[] arr, int index, int heapSize){
        int left =  index*2-1;
        while (left < heapSize){
         int largest = left+1 < heapSize && arr[left + 1]> arr[left] ? left +1  : left;
         largest = arr[largest] > arr[index]? largest :index;

         if(largest == index){
                break;
         }

            swap(arr ,largest , index);
            index =largest;
            left = index*2+1;
        }
    }
}

相关推荐

  1. 实现排序

    2024-07-16 12:22:05       22 阅读
  2. 2024-07-16 12:22:05       49 阅读
  3. python实现排序

    2024-07-16 12:22:05       32 阅读
  4. c/c++ | 优先队列 | 、小

    2024-07-16 12:22:05       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 12:22:05       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 12:22:05       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 12:22:05       62 阅读
  4. Python语言-面向对象

    2024-07-16 12:22:05       72 阅读

热门阅读

  1. 极客笔记【收藏】

    2024-07-16 12:22:05       25 阅读
  2. 嵌入式驱动源代码(10):NFC芯片PN532驱动开发

    2024-07-16 12:22:05       22 阅读
  3. Spring源码注解篇二:手写@Component注解

    2024-07-16 12:22:05       23 阅读
  4. kafka入坑

    2024-07-16 12:22:05       16 阅读
  5. Memcached说明、安装、配置、工具

    2024-07-16 12:22:05       24 阅读
  6. 【Linux/Vim】Vim使用教程及速查手册

    2024-07-16 12:22:05       25 阅读
  7. Vue3学习:如何在Vue3项目中创建一个axios实例

    2024-07-16 12:22:05       24 阅读
  8. 机器学习中的LeetCode

    2024-07-16 12:22:05       22 阅读
  9. 安全加固:Eureka服务实例安全令牌配置全解析

    2024-07-16 12:22:05       29 阅读
  10. Linux 环境下整体备份迁移 Docker 镜像及数据教程

    2024-07-16 12:22:05       28 阅读