【算法导论】C++参考源码之堆排序中的优先级队列

来源:互联网 发布:金融数据分析导论 编辑:程序博客网 时间:2024/05/23 00:05

这篇例子中有几处BUG,无法插入新值,因为数组已经定义好了大小,解决方法:可以选择STL的容器来,也可以选择在已有的内存上使用动态分配。

#include <iostream>using namespace std;#define GET_ARRAY_LEN(array,len){len = (sizeof(array) / sizeof(array[0]));}int length = 0;void max_heapify(int A[], int i){  int largest;  int l = 2 * (i + 1) - 1;  int r = 2 * (i + 1);  if (l <= length && A[l] > A[i])  largest = l;  else  largest = i;  if (r <= length && A[r] > A[largest])  largest = r;  if (largest != i)  {  swap(A[i], A[largest]);  max_heapify(A, largest);  }  }int getParent(int i){if(i % 2 == 0) return (i / 2 - 1); else return ((i + 1)  / 2 - 1);}// 返回堆的最大值int heap_maximum(int A[]){return A[0];}// 取出最大值并去除int heap_extract_max(int A[]){if (length < 1){cerr << "error!" << endl;exit(0);}int max = A[0];A[0] = A[length - 1];--length;max_heapify(A, 0);return max;}// 调高第i个值的优先级到key值void heap_increase_key(int A[], int i, int key){if (key < A[i]){cerr << "error!" << endl;exit(0);}A[i] = key;int parent_i = getParent(i);while (i > 0 && A[getParent(i)] < A[i]){swap(A[i], A[getParent(i)]);i = getParent(i);}}// 在优先级队列中插入值void max_heap_insert(int A[], int key){++length;A[length - 1] = -0xFFFF;heap_increase_key(A, length - 1, key);}int main(){int A[] = {16, 14, 10, 8, 7, 9, 3, 2, 4, 1};  GET_ARRAY_LEN(A, length);heap_increase_key(A, 8, 15);heap_extract_max(A);//max_heap_insert(A, 100);for (int i = 0; i < length; ++i){cout << A[i] << " ";}cout << endl;return 0;  }

原创粉丝点击