diff --git a/MaxHeap.txt b/MaxHeap.txt new file mode 100644 index 0000000000000000000000000000000000000000..d1975888404a95a920f3b71d81f55ff353406d26 --- /dev/null +++ b/MaxHeap.txt @@ -0,0 +1,110 @@ +package jianzhiOffer; + +import java.util.ArrayList; +import java.util.List; +public class MaxHeap> { + private List mHeap; + + public MaxHeap() { + + this.mHeap = new ArrayList<>(); + } + protected void filterup(int start) { + + int c = start; + int p = (c - 1) / 2; + T tmp = mHeap.get(c); + + while (c > 0) { + int cmp = mHeap.get(p).compareTo(tmp); + if (cmp >= 0) { + break; + } else { + mHeap.set(c, mHeap.get(p)); + c = p; + p = (c - 1) / 2; + } + } + mHeap.set(c, tmp); + } + protected void filterdown(int start, int end) { + + int c = start; + int l = 2 * c + 1; + T tmp = mHeap.get(c); + + while (l <= end) { + int cmp = mHeap.get(l).compareTo(mHeap.get(l + 1)); + if (l < end && cmp < 0) { + l++; + } + cmp = tmp.compareTo(mHeap.get(l)); + if (cmp >= 0) { + break; + } else { + mHeap.set(c, mHeap.get(l)); + c = l; + l = 2 * c + 1; + } + } + mHeap.set(c, tmp); + } + public void insert(T data) { + + int insertIndex = mHeap.size(); + mHeap.add(data); + filterup(insertIndex); + } + public int remove(T data) { + + if (mHeap.isEmpty()) { + return -1; + } + + int index = mHeap.indexOf(data); + if (index == -1) { + return -1; + } + int size = mHeap.size(); + mHeap.set(index, mHeap.get(size - 1)); + mHeap.remove(size - 1); + if (mHeap.size() > 1 && index < mHeap.size()) { + filterdown(index, mHeap.size() - 1); + } + return 0; + } + + + @Override + public String toString() { + + StringBuilder sb = new StringBuilder(); + for(int i = 0; i < mHeap.size(); i++) { + sb.append(mHeap.get(i) + " "); + } + return sb.toString(); + } + + public static void main(String[] args) { + + int a[] = {10, 40 ,30, 60, 90, 70, 20, 50 ,80}; + MaxHeap maxHeap = new MaxHeap<>(); + System.out.println("=== 依次添加元素:"); + for(int i = 0; i < a.length; i++) { + System.out.println(a[i]); + maxHeap.insert(a[i]); + } + System.out.println("=== 生成的大顶堆:"); + System.out.println(maxHeap); + int data = 85; + maxHeap.insert(data); + System.out.println("=== 添加新元素" + data + "之后的大顶堆:"); + System.out.println(maxHeap); + + data = 90; + maxHeap.remove(data); + System.out.println("=== 删除元素" + data + "之后的大顶堆:"); + System.out.println(maxHeap); + + } +} \ No newline at end of file