实现一个O(lgn)的最大堆优先队列的delete操作。
Heap-Delete(A,i)操作能够将节点i从对中A删除。
代码说明:假如删除序号为i的节点,那么我们先把最后的节点,放到i中去,然后对i进行堆维护,即向下维护堆,然后此时得到的序号为i的值向下能满足堆的性质,但向上不一定可以,所以我们再向上维护堆。这样完成后就可以了。应为向上向下加起来刚好是h,所以时间复杂度为O(lgn)。
#include<iostream> using namespace std; #define Left(i) i*2+1 #define Right(i) i*2+2 #define Parent(i) (i-1)/2 int size = 10; void MaxHeapInsertKey(int a[], int i) { if (Parent(i) >= 0 && a[Parent(i)] < a[i]) { int temp = a[Parent(i)]; a[Parent(i)] = a[i]; a[i] = temp; MaxHeapInsertKey(a, Parent(i)); } } void MaxHeap(int a[], int i) { int L = Left(i); int R = Right(i); int largest = i; if (L<size&&a[L]>a[largest]) { largest = L; } if (R<size&&a[R]>a[largest]) { largest = R; } if (largest != i) { int temp = a[largest]; a[largest] = a[i]; a[i] = temp; MaxHeap(a, largest); } } int HeapDelete(int a[], int i) { int temp; temp = a[i]; a[i] = a[size - 1]; size--; MaxHeap(a, i); MaxHeapInsertKey(a, i); return temp; } int main() { int a[] = { 16, 4, 10, 14, 7, 9, 3, 2, 8, 1 }; HeapDelete(a, 1); for (int i = 0; i < size; i++) cout <<a[i]<<" "; }
时间: 2024-10-11 12:35:11