大根堆
大根堆与小根堆类似,只是它的堆顶元素值是最大的,子节点的值小于父节点的值,一般用来在n个数中找出最小的m个数
/**
* @author lzq
*
*/
public class DaGenDui {
private static final int LENGTH = 10;
private int size;
private int maxsize;
private int[] array;
public DaGenDui() {
initHeap(LENGTH);
}
public DaGenDui(int capacity) {
if(capacity<1) {
System.out.println("非法长度");
}
initHeap(capacity);
}
private void initHeap(int initCapacity) {
this.maxsize = initCapacity;
array = new int[initCapacity];
size = 0;
}
public void add(int x) {
if(size==0) {
array[size++] = x;
}else if(!isFull()) {
adjust1(size++,x);
}else {
if(x < getTop()) {
remove();
add(x);
}
}
}
public boolean isFull() {
return size>=maxsize;
}
public int getTop() {
return array[0];
}
public int remove() {
int cur = getTop();
int temp = array[--size];
array[0] = temp;
adjust2(0,temp);
return cur;
}
private void adjust1(int k,int value) {
while(k>0) {
int root = (k-1)>>>1;
if(array[root]>=value) {
break;
}
array[k] = array[root];
k = root;
}
array[k] = value;
}
private void adjust2(int k,int vale) {
int half = size>>>1;
while (k<half) {
int child = (k<<1)+1;
int childVal = array[child];
int RightChild = child+1;
//此处要找最大的孩子
if(RightChild<size && childVal<array[RightChild]) {
childVal = array[child = RightChild];
}
if(childVal<vale) {
break;
}
array[k] = array[child];
k = child;
}
array[k] = vale;
}
public void show() {
for (int i = 0; i < size; i++) {
System.out.print(array[i]+" ");
}
System.out.println();
}
public void put(int[] a) {
for (int i = 0; i < a.length; i++) {
add(a[i]);
}
}
}
运行结果:
25 12 16 5 4