优先队列(二叉堆,堆排序)

2.4 优先队列(二叉堆)

简介:可以删除最大元素和插入元素
特点:高效(对数级别的)删除最大元素和插入元素操作

public class PriorityHeap {
//小顶堆
//Instance Variables
int[] arr;
int size;
//Constructors
//堆的大小默认为64
public PriorityHeap() {
	this(64);
}
public PriorityHeap(int initSize) {
	super();
	this.arr =new int[initSize];
	this.size = 0;
}
//获取最小的元素
public int min() {
	return arr[0];
}
//删除最小的元素
public int pop() {
	int res=arr[0];
	arr[0]=arr[--size];
	sink(0);
	return res;
}
public void add(int data) {
	arr[size++]=data;
	swim(size-1);
}
private void sink(int i) {
	//当列表第一个是以下标0开始,结点下标为i,左孩子则为2*i+1,右孩子下标则为2*i+2;
	//若下标以1开始,左孩子则为2*i,右孩子则为2*i+1
	while(2*i+1<=size-1) {
		int j=2*i+1;	//j表示左孩子的下标
		//如果右孩子小于左孩子
		if(j<size-1&&this.arr[j]>
				this.arr[j+1]) {
			j++;
		}
		if(this.arr[i]<=this.arr[j]) {
			break;
		}
		//当左右孩子的最小值小于父节点时,则交换
		exch(i,j);
		i=j;
	}
	
}
private void swim(int i) {
    while (i > 0) {
        int parent = i / 2;
        if (this.arr[i] >= this.arr[parent]) {
            break;
        }
        exch(i, parent);
        i = parent;
    }
}
private void exch(int a,int b) {
	int t=this.arr[a];
	this.arr[a]=this.arr[b];
	this.arr[b]=t;
}

public static void main(String[] args) {
	PriorityHeap heap=new PriorityHeap();
	int[] arr= {5,6,9,8,7,2,10,56,21,64,11};
	for (int i : arr) {
		heap.add(i);
	}
	int n=heap.size;
	//依次输出最小值
	for(int i=0;i<n;i++) {
		System.out.print(heap.pop()+" ");
	}
}
}

猜你喜欢

转载自blog.csdn.net/qq_40908515/article/details/86758309