基于算法导论6.5用最大堆实现的优先队列(C++)
2015-05-07 15:59
1016 查看
// algorithms.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "iostream" using std::cout; using std::endl; int heapSize; const int arraySize = 10; void maxHeapIFY(int *,int); void buildHeap(int *,int length); void swap(int &, int &); int heapMaximum(int *); int HeapExtractMax(int *); void heapIncreaseKey(int *, int, int); void maxHeapInsert(int *a, int key); int main() { int a[10] = { 121, 22, 13, 34, 53, 62, 71, 48, 59, 104}; buildHeap(a, arraySize); HeapExtractMax(a); maxHeapInsert(a, 1); for (size_t i = 0; i < arraySize; i++) { cout << a[i] << " "; } return 0; } void buildHeap(int *a,int length){ heapSize = length - 1; for (int i = length>>1; i >= 0; i--) { maxHeapIFY(a, i); } } void maxHeapIFY(int *a,int i){ int l = (i << 1) + 1; int r = (i << 1) + 2; int largest; if (l <= heapSize && a[i] < a[l]) { largest = l; } else { largest = i; } if (r <= heapSize && a[largest] < a[r]) { largest = r; } while (largest!=i) { swap(a[largest], a[i]); i = largest; int l = (i << 1) + 1; int r = (i << 1) + 2; if (l <= heapSize && a[i] < a[l]) { largest = l; } else { largest = i; } if (r <= heapSize && a[largest] < a[r]) { largest = r; } } } void swap(int &i, int &j){ int temp = i; i = j; j = temp; } int heapMaximum(int *a) { return a[1]; } int HeapExtractMax(int *a) { if (heapSize < 0) { cout << "heap underflow\n 堆下溢" << endl; return -1; } else { int max = a[0]; a[0] = a[heapSize]; heapSize = heapSize - 1; maxHeapIFY(a, 0); return max; } } void heapIncreaseKey(int *a, int i, int key) { if (key < a[i]) { cout << "new key is smaller than current key\n 新关键字小于当前关键字" << endl; return; } a[i] = key; int parent = i % 2 == 0 ? (i >> 1) - 1 : i >> 1; //找父节点,由于是根节点是0开始,所以当节点是单数时父节点是当节点除以2,当节点是双数时父节点是当前节点除以2减1 while (i>0 && a[parent] < a[i]) { swap(a[parent], a[i]); i = parent; parent = i % 2 == 0 ? (i >> 1) - 1 : i >> 1; } } void maxHeapInsert(int *a, int key) { if (heapSize == arraySize - 1) { cout << "heap size is larger than array size\n堆大小比数组长度大" << endl; return; } heapSize = heapSize + 1; a[heapSize] = -100000000; heapIncreaseKey(a, heapSize, key); }
相关文章推荐
- 算法设计之,堆,堆排序,基于最大堆的最大优先队列的实现(C++实现)
- C++最大堆实现priority_queue优先级队列(算法导论)
- 算法(第四版)学习笔记之java实现基于堆的优先队列
- 基于最大堆的最大优先队列的实现(C语言)
- Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)
- 算法导论-第23章-最小生成树:Prime算法(基于vector)的C++实现
- [算法导论] 快速排序以及最大堆的C++实现
- 最大优先队列--【算法导论】
- [C++ 实现最大值优先队列和最小值优先队列]
- 初学算法-基于最小堆的优先级队列C++实现
- 用最大堆实现优先队列(c++)
- 算法入门--最大堆实现优先队列
- 算法导论 4.1-5 最大子数组问题 线性时间算法 C++简单实现
- 算法笔记(堆实现的最大优先队列)