堆(一)最大堆和最小堆的实现

最大堆和最小堆的实现

这一讲讲的还是堆,因此将它归入到堆(一)中。这一篇博客的目的非常简单,就是补充一下堆的实现代码。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);
        }
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值