最大堆和最小堆的实现
这一讲讲的还是堆,因此将它归入到堆(一)中。这一篇博客的目的非常简单,就是补充一下堆的实现代码。Heap是抽象类,它有两个子类,MaxHeap和MinHeap。回顾一下堆的性质:
最大堆:堆中每一个元素(root除外)都满足,A[parent(i)] >= A[i]. (A为堆, A[i]为相应元素)。
最小堆:堆中每一个元素(root除外)都满足,A[parent(i)] <= A[i]. (A为堆, A[i]为相应元素)。
Heap
Heap,代码如下,它是一个抽象的父类。两个最重要的方法是buildHeap和heapify。
heapify方法:在一个最大堆中,改变元素i的值,为了保持最大堆性质,而调用这个方法。时间复杂度是O(h),h为元素i的高度。
buildHeap方法:从底部元素开始,自底向上构建最大堆。时间复杂度是O(n).
其中,heapify方法由子类重写。
package heap;
public abstract class Heap {
int[] items;
int heapSize;
Heap(int capacity) {
items = new int[capacity];
}
// 根据Max或者Min而变化
private void buildHeap() {
heapSize = items.length;
for (int i = heapSize/2-1; i > -1;i--) {
heapify(i);
}
}
// 根据Max或者Min而变化
protected abstract void heapify(int i);
int left(int i) {
return 2*i+1;
}
int right(int i) {
return 2*i+2;
}
}
MinHeap
实现了minHeapify方法。
package heap;
public class MinHeap extends Heap{
public MinHeap(int capacity) {
super(capacity);
}
@Override
protected void heapify(int i) {
int l = left(i);
int r = right(i);
int smallest = i;
if (l < heapSize && items[l] < items[smallest]) smallest = l;
if (r < heapSize && items[r] < items[smallest]) smallest = r;
if (smallest != i) {
int tmp = items[smallest];
items[smallest] = items[i];
items[i] = tmp;
heapify(smallest);
}
}
}
MaxHeap
package heap;
public class MaxHeap extends Heap {
public MaxHeap(int capacity) {
super(capacity);
}
@Override
protected void heapify(int i) {
int l = left(i);
int r = right(i);
int largest = i;
if (l < heapSize && items[l]>items[largest]) largest = l;
if (r < heapSize && items[r]>items[largest]) largest = r;
if (largest != i) {
int tmp = items[i];
items[i] = items[largest];
items[largest] = tmp;
heapify(largest);
}
}
}