用容量为k的最小堆实现:
/*
*
* @Time : 12/24/2018 20:34
* @Author : Zhang, Chen (chansonzhang)
* @Email : ZhangChen.Shaanxi@gmail.com
* @FileName: MinHeap.java
*/
public class MinHeap {
private int[] elements;
private int heapSize;
public int[] getElements() {
return elements;
}
public MinHeap(int heapSize) {
this.heapSize = heapSize;
elements = new int[heapSize];
}
public int insert(int x) {
if (x <= elements[0]) {
return -1; //insert failure
}
elements[0] = x;
return adjustDown(0);
}
public int adjustDown(int currentIndex) {
int leftIndex = leftChildIndex(currentIndex);
int rightIndex = rightChildIndex(currentIndex);
int minElementIndex = currentIndex;
if (leftIndex < this.heapSize && elements[leftIndex] < elements[minElementIndex])
minElementIndex = leftIndex;
if (rightIndex < this.heapSize && elements[rightIndex] < elements[minElementIndex]) {
minElementIndex = rightIndex;
}
if (minElementIndex != currentIndex) {
swap(currentIndex, minElementIndex);
return adjustDown(minElementIndex);
} else {
return currentIndex;
}
}
private int leftChildIndex(int i) {
return 2 * i + 1;
}
private int rightChildIndex(int i) {
return 2 * i + 2;
}
private void swap(int i, int j) {
int tmp = elements[i];
elements[i] = elements[j];
elements[j] = tmp;
}
public static void main(String[] args){
int[] a={0,1,2,3,5,6,4,9,7,8};
int k=3;
MinHeap minHeap=new MinHeap(3);
for(int x:a){
minHeap.insert(x);
}
System.out.println("The max k numbers:");
for(int x:minHeap.getElements()){
System.out.print(x+" ");
}
System.out.println("\nThe k-th largest Number "+minHeap.getElements()[0]);
}
}
输出如下:
The max k numbers:
7 8 9
The k-th largest Number 7