zoukankan      html  css  js  c++  java
  • 索引堆

    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]);
    }
    }

    }
  • 相关阅读:
    2020软件工程作业04
    2020软件工程作业03
    2020软件工程作业02
    2020软件工程作业01
    Linux操作系统分析-课程学习总结报告
    结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程
    深入理解系统调用
    基于mykernel 2.0编写一个操作系统内核
    交互式多媒体图书平台的设计与实现
    码农放入自我修养之必备技能学习笔记
  • 原文地址:https://www.cnblogs.com/cold-windy/p/11217754.html
Copyright © 2011-2022 走看看