优先队列的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
- 优先队列 C实现
- 优先队列的精简实现(c++)
- 【C++】【STL】优先队列的实现
- 优先队列的实现
- 优先队列的实现
- 优先队列C语言实现
- 优先队列--C语言实现
- c语言最小堆的实现-优先队列
- 优先队列的数组实现
- 优先队列的简单实现
- 优先队列的c++实现
- 索引优先队列的实现
- 优先队列的一种实现
- 索引优先队列的实现
- PriorityQueue 优先队列的实现
- C语言队列实现广度优先遍历
- 优先队列二叉堆 C语言实现
- 数据结构 优先队列 C语言实现
- [C_9] IO & 标准库
- 硬盘安装Windows 7方法大全
- HQL语句总结
- 通用版按钮/超链接鼠标效果渐变jQuery代码
- 排名分析函数 rank(),dense_rank(),row_number()
- 优先队列的c++实现
- 静态内部类加载情况和基本类加载过程一样
- 随手记录(之后整理)
- Win 7 U盘安装系统
- 编写安全代码:小心volatile的原子性误解
- pat1044. Shopping in Mars
- 多多写博客
- 通过图片链接地址判断图片有没缓存以及是否已经加载完成
- linux yum命令详解