diff --git "a/\345\256\236\347\216\260\345\244\247\351\241\266\345\240\206.txt" "b/\345\256\236\347\216\260\345\244\247\351\241\266\345\240\206.txt" new file mode 100644 index 0000000000000000000000000000000000000000..3b1ef2863908f11749b32704934907f28f10be25 --- /dev/null +++ "b/\345\256\236\347\216\260\345\244\247\351\241\266\345\240\206.txt" @@ -0,0 +1,120 @@ +import java.util.ArrayList; +import java.util.List; +//(1)定义大顶堆 +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); + } + //(2)入堆 + public void insert(T data) { + + int insertIndex = mHeap.size(); + + mHeap.add(data); + filterup(insertIndex); + } + + //(3)出堆 + 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(); + } + //(4)大顶堆的应用 + 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); + + } +}