优先队列的c++实现

来源:互联网 发布:脱发怎么办知乎 编辑:程序博客网 时间:2024/04/25 13:31

一、优先队列c++实现源代码

#include <iostream>#include <assert.h>using namespace std;//function: 返回最大值int HeapMaximum(int* array);//function: 返回最大值并删除int HeapRactMax(int*& array, int n);void Exchange(int* a, int* b);//function: 维护堆的性质void RecursionHeap(int* array, int i, int n);//function: 建堆void BuildHeap(int* array, int n);//function: 关键字的值增加到keyvoid IncreaseKey(int* array, int i, int key);//function: 插入一个元素void InsertKey(int*& array, int key, int n);int main(){int* array = new int[10];for (int i = 0; i < 10; ++ i)cin >> array[i];BuildHeap(array, 10);for (i = 0; i < 10; ++ i)cout << array[i] << " ";cout << endl;cout << HeapMaximum(array) << endl; //测试最大值cout << HeapRactMax(array, 10) << endl; //for (i = 0; i < 9; ++ i)cout << array[i] << " ";cout << endl;IncreaseKey(array, 8, 100);for (i = 0; i < 9; ++ i)cout << array[i] << " ";cout << endl;InsertKey(array, 10, 9);for (i = 0; i < 10; ++ i)cout << array[i] << " ";cout << endl;delete [] array;return 0;}int HeapMaximum(int* array){return array[0];}int HeapRactMax(int*& array, int n){assert(n);int tmp = array[0];Exchange(&array[0], &array[n - 1]);RecursionHeap(array, 0, n - 1);int *pTmp = new int[n - 1];memcpy(pTmp, array, (n - 1) * sizeof (int));delete [] array;array = pTmp;return tmp;}void Exchange(int* a, int* b){int tmp = *a;*a = *b;*b = tmp;}void RecursionHeap(int* array, int i, int n){int large;if (2 * i + 1 < n && array[2 * i + 1] > array[i])large = 2 * i + 1;elselarge = i;if (2 * i + 2 < n && array[2 * i + 2] > array[large])large = 2 * i + 2;if (large != i){Exchange(&array[i], &array[large]);RecursionHeap(array, large, n);}}void IncreaseKey(int* array, int i, int key){assert(key >= array[i]);array[i] = key;int parent;// for (int j = i; j >= 0; )// {// parent = (j - 1) / 2;// if (parent >= 0 && array[parent] < key)// {// array[j] = array[parent];// j = parent;// if (parent == 0)// {// array[0] = key;// break;// }// }// else// {// array[j] = key;// break;// }// }parent = (i - 1) / 2;while (parent >= 0 && array[parent] < array[i]){Exchange(&array[parent], &array[i]);i = parent;parent = (i - 1) / 2;}}void InsertKey(int*& array, int key, int n){int* pTmp = new int[n + 1];memcpy(pTmp, array, sizeof (int) * n);delete []array;pTmp[n] = -100000;IncreaseKey(pTmp, n, key);array = pTmp;}void BuildHeap(int* array, int n){for (int i = (n - 2) / 2; i >= 0; -- i)RecursionHeap(array, i, n);}


二、注意

1、形参的拷贝是赋值传递,在函数内部处理的只是一个副本,如果想改变指针的地址值,应该通过引用方式传递。

2、边界条件的处理。例如 j = (j - 1) / 2; j的下限就是0,值得思考。

3、 如果for循环中要用到break,可以考虑用while来替换,往往代码更加简便。

0 0