堆的实现
// heap.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<vector> #include<algorithm> #include<iostream> using namespace std; #define LARGENUM 1000000 class Heap { private: vector<int> array; int find(int tofind) { vector<int>::iterator it; it = std::find(array.begin(), array.end(), tofind); return it == array.end() ? -1 : it - array.begin(); } public: Heap()//构造 { array.push_back(LARGENUM);//哨兵 } void insert(const int val)//插入 { _ASSERTE(val < LARGENUM); array.push_back(val); int index = array.size() - 1; while (array[index] > array[index / 2]) { array[index] = array[index/ 2]; array[index / 2] = val; index = index / 2; } } bool erase(int val)//删除 { int index = find(val); if (index < 0) return false; array[index] = array.back(); array.pop_back(); while (index * 2 < array.size()) { int t = array[index]; if (2 * index + 1 < array.size()) { if (array[index] > array[2 * index] && array[index] > array[2 * index + 1]) return true; int nn = array[2 * index + 1] > array[2 * index] ? 2 * index + 1 : 2 * index; array[index] = array[nn]; array[nn] = t; index = nn; } else { if (array[index] > array[2 * index]) return true; int t = array[index]; array[index] = array[2 * index]; array[2 * index] = t; return true; } } } int top()//返回堆顶 { _ASSERTE(array.size() != 1); return array[1]; } void pop()//弹出堆顶 { _ASSERTE(array.size() != 1); array[1] = array.back(); array.pop_back(); int index = 1; while (index * 2 < array.size()) { int t = array[index]; if (2 * index + 1 < array.size()) { if (array[index] > array[2 * index] && array[index] > array[2 * index + 1]) return; int nn = array[2 * index + 1] > array[2 * index] ? 2 * index + 1 : 2 * index; array[index] = array[nn]; array[nn] = t; index = nn; } else { if (array[index] > array[2 * index]) return; int t = array[index]; array[index] = array[2 * index]; array[2 * index] = t; return; } } } bool empty() { return array.size() == 1; } int size()//返回堆的大小 { return array.size() - 1; } }; int _tmain(int argc, _TCHAR* argv[]) { Heap h; h.insert(10); h.insert(35); h.insert(19); h.insert(5); h.insert(2); h.insert(51); h.insert(37); h.insert(7); h.insert(45); h.insert(63); cout << h.size() << endl; cout << h.top()<< endl; h.pop(); cout << h.size() << endl; cout << h.top() << endl; h.erase(45); system("pause"); return 0; }
版权声明: