索引堆

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

}
posted @ 2019-07-20 14:58  小路不会迷路  阅读(323)  评论(0编辑  收藏  举报