优先队列的c++实现
2014-02-27 22:15
477 查看
一、优先队列c++实现源代码
二、注意
1、形参的拷贝是赋值传递,在函数内部处理的只是一个副本,如果想改变指针的地址值,应该通过引用方式传递。
2、边界条件的处理。例如 j = (j - 1) / 2; j的下限就是0,值得思考。
3、 如果for循环中要用到break,可以考虑用while来替换,往往代码更加简便。
#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: 关键字的值增加到key void 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; else large = 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 = -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来替换,往往代码更加简便。
相关文章推荐
- C++实现优先队列——最小堆,d路堆及配对堆
- 【数据结构】实现大小堆也叫二叉堆(类似c++中的优先队列)
- 【C++】【STL】优先队列的实现
- 优先队列C++实现和应用
- C++非递归队列实现二叉树的广度优先遍历
- C++ 大根堆 实现优先队列
- 算法导论 第六章优先队列C++实现
- 算法导论 第六章优先队列C++实现
- 迷宫最短路径的C++实现(队列:广度优先)
- 优先队列(C++实现)
- 迷宫最短路径的C++实现(队列:广度优先)
- [C++ 实现最大值优先队列和最小值优先队列]
- 算法设计之,堆,堆排序,基于最大堆的最大优先队列的实现(C++实现)
- C++ 优先队列的简单实现
- 优先队列(堆)C++实现源码
- 最小堆优先队列C++实现
- 优先队列的应用 C++实现
- 基于算法导论6.5用最大堆实现的优先队列(C++)
- C++实现优先队列