解題心得:
就.....資料結構實作。
參考文章:Min Heap and Max Heap Implementation in C++
程式碼:
#include<iostream> using namespace std; class maxHeap { public: maxHeap() { size = 0; for (int i = 0; i < 1025; i++) arr[i] = 0; } int arr[1025]; int size; int parent(int i) { return (i - 1) / 2; } int find_left(int i) { return 2 * i + 1; } int find_right(int i) { return 2 * i + 2; } int getSize() { return size; } bool isEmpty() { return size == 0; } void heap_down(int i) { int left = find_left(i), right = find_right(i); int largest = i; if (left < this->size && arr[left] > arr[i]) largest = left; if (right < this->size && arr[right] > arr[largest]) largest = right; if (largest != i) { swap(arr[i], arr[largest]); heap_down(largest); } } void heap_up(int i) { if (i != 0 && arr[parent(i)] < arr[i]) { swap(arr[i], arr[parent(i)]); heap_up(parent(i)); } } void push(int n) { arr[this->size] = n; this->size++; heap_up(this->size - 1); } void pop() { arr[0] = arr[this->size - 1]; this->size--; heap_down(0); } int top() { return arr[0]; } }; class minHeap { public: minHeap() { size = 0; for (int i = 0; i < 1025; i++) arr[i] = 0; } int arr[1025]; int size; int parent(int i) { return (i - 1) / 2; } int find_left(int i) { return 2*i + 1; } int find_right(int i) { return 2 * i + 2; } int getSize() { return size; } bool isEmpty() { return size == 0; } void heap_down(int i) { int left = find_left(i), right = find_right(i); int smallest = i; if (left < this->size && arr[left] < arr[i]) smallest = left; if (right < this->size && arr[right] < arr[smallest]) smallest = right; if (smallest != i) { swap(arr[i], arr[smallest]); heap_down(smallest); } } void heap_up(int i) { if (i != 0 && arr[parent(i)] > arr[i]) { swap(arr[i], arr[parent(i)]); heap_up(parent(i)); } } void push(int n) { arr[this->size] = n; this->size++; heap_up(this->size - 1); } void pop() { arr[0] = arr[this->size - 1]; this->size--; heap_down(0); } int top() { return arr[0]; } }; int main() { int n; while (cin >> n) { minHeap heap1; maxHeap heap2; while (n--) { int num; cin >> num; heap1.push(num); heap2.push(num); } for (int i = 0; i < heap1.size; i++) { if (i != heap1.size-1) cout << heap1.arr[i] << " "; else cout << heap1.arr[i] << endl; } for (int i = 0; i < heap2.size; i++) { if (i != heap2.size - 1) cout << heap2.arr[i] << " "; else cout << heap2.arr[i] << endl; } } return 0; }
沒有留言:
張貼留言