堆及堆排序
2008-11-17 20:05
10 查看
#include <iostream> #include <fstream> #include <vector> using namespace std; void createheap(vector<int> &a, int n); void HInsert(vector<int> &a, int m); int a[11] = {1000, 2, 6, 7, 4, 1, 8, 9, 12, 11, 23}; vector<int> b(a, a+11); void createheap(vector<int> &a, int n) { for (int i=n/2; i>0; i--) { int key = a[i]; int temp = i; while (2*temp <= n) { int j = 2 * temp; if (j < n) { if (a[j] < a[j+1]) { j = j + 1; } } if (key < a[j]) { a[temp] = a[j]; temp = j; } else { break; } } a[temp] = key; } } void HInsert(vector<int> &a, int m) { /* a.push_back(m); int index = a.size()-1; //可以重新建堆,但是这样做显然很浪费时间. createheap(a, index); */ a.push_back(m); int j = a.size()-1; int key = a[j]; int t = j / 2; while (t>0) { if (key > a[t]) { a[j] = a[t]; j = t; t = t / 2; } else { break; } } a[j] = key; } void deleteTop(vector<int> &a) { int temp = a[a.size()-1]; a[a.size()-1] = a[1]; a[1] = temp; a.pop_back(); int j = 1; while (2*j <= a.size()-1) { int m = 2 * j; if (m < a.size()-1) { if (a[m] < a[m+1]) { m = m + 1; } } if (temp < a[m]) { a[j] = a[m]; j = m; } else { break; } } a[j] = temp; } int main() { createheap(b, b.size()-1); for (int i=1; i<b.size(); i++) { printf("%d ", b[i]); } HInsert(b, 133); HInsert(b, 23); HInsert(b, 33); HInsert(b, 103); HInsert(b, 15); printf("/n"); for (int i=1; i<b.size(); i++) { printf("%d ", b[i]); } printf("/n"); deleteTop(b); deleteTop(b); for (int i=1; i<b.size(); i++) { printf("%d ", b[i]); } return 0; }