• 索引堆


    package heap;

    public class IndexMaxHeap {
    private int[] data;
    private int count;
    private int capacity;
    private int[] indexes;

    public IndexMaxHeap(int capacity){    //索引堆的构造方法
    this.capacity=capacity;
    data=new int[capacity+1]; //data数组分配,下标从1开始的,对于外界用户来看的话,都是从0开始的,输入进来以后要处理
    indexes=new int[capacity+1]; //为索引数组分配
    count=0;              //记录总共有多少个元素,初始化为0
    }
    public void insert(int i,int n) //插入元素ndata[i]的位置
    {
    i++;
    data[i]=n;
    indexes[count+1]=i;
    count++;
    shiftUp(count);
    }

    private void shiftUp(int n) {


    while(n>1&&data[indexes[n/2]]<data[indexes[n]])
    {
    swap(indexes,n/2,n);
    n=n/2;
    }
    }
    public int size(){
    return count;
    }
    public boolean isEmpty(){
    return count==0;
    }
    public int getMax()//复制一个最大值
    {
    assert (count>0);
    return data[indexes[1]];
    }
    public int extractMaxIndex()//取出最大索引,就可以找到对应的data最大值了
    {
    assert(count-1>0);
    int max=indexes[1]-1;
    swap(indexes,count,1);
    count--;
    shiftDown(1);
    return max;
    }
    public int extractMax()//直接将最大值取出来了,堆里面没有了
    {
    assert(count-1>0);
    int max=data[indexes[1]];
    swap(indexes,count,1);
    count--;
    shiftDown(1);
    return max;
    }
    public void change(int i,int item)
    {
    i+=1; //将索引转化成从1开始的
    data[i]=item;
    for(int j=1;j<=count;j++)
    {
    if(indexes[j]==i)
    {
    shiftDown(j);
    shiftUp(j);
    return;
    }
    }
    }


    private void shiftDown(int i) {
    int j=i*2; //找出左节点
    while(j<=count) //如果存在子节点,就要继续往下走,不论是否存在右节点
    {
    if(j+1<=count&&data[indexes[j+1]]>data[indexes[j]]) //如果存在右节点,比较左右节点
    {
    if(data[indexes[j+1]]>data[indexes[i]])
    {
    swap(indexes, i, j + 1);
    i = j + 1;
    j = 2 * i;
    }
    else
    break;
    }
    else
    {
    if(data[indexes[j]]>data[indexes[i]])
    {
    swap(indexes,i,j);
    i=j;
    j=2*i;
    }
    else
    break;
    }
    }

    }

    public void swap(int[] arr,int l,int r)
    {
    int temp=arr[l];
    arr[l]=arr[r];
    arr[r]=temp;
    }

    public static void main(String[] args) {
    IndexMaxHeap maxHeap=new IndexMaxHeap(100);
    int N=100;
    int M=100;
    for(int i=0;i<100;i++)
    {
    maxHeap.insert(i,(int) (Math.random()*M));
    }
    int[] arr=new int[N];
    for(int i=0;i<N;i++)
    {
    arr[i]=maxHeap.extractMax();
    }
    for (int i = 0; i <N ; i++) {
    System.out.println(arr[i]);
    }
    }

    }
  • 相关阅读:
    shell log
    Python:列出列表中所有元素的组合可能
    scrapy 停止爬虫
    shell split log by data
    mitmproxy 配置
    插件reres的使用,替换网站的js文件
    解决小米Note adb调试无法发现设备
    md5 计算文件一致性
    【Frida Hook 学习记录】Frida Hook Android 常用方法
    监控神器普罗米修斯Prometheus安装配置
  • 原文地址:https://www.cnblogs.com/cold-windy/p/11217754.html
Copyright © 2020-2023  润新知