博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 实现最大堆排序与最大优先队列
阅读量:6992 次
发布时间:2019-06-27

本文共 3211 字,大约阅读时间需要 10 分钟。

我一向赞同一个理念: 用代码实现简单逻辑是不需要注释的, 因此我也就不写注释了, 直接上代码: 

#include 
#include
#include
inline int Parent (const int i){ return std::move( i % 2 ? (i - 1) / 2 : (i - 2) / 2);}inline int Left (const int i){ return std::move(2 * i + 1);}inline int Right (const int i){ return std::move(2 * i + 2);}void MaxHeapify (std::deque
&ideq, int node){ int largest = node; int limit = ideq.size (); auto SmallerThan = [&] (int child){ return (child < limit) && (ideq[largest] < ideq[child]); }; int leftNode = Left (node); if (SmallerThan (leftNode)) { largest = leftNode; } int rightNode = Right (node); if (SmallerThan (rightNode)) { largest = rightNode; } if (largest != node) { std::swap (ideq[largest], ideq[node]); MaxHeapify (ideq, largest); }}std::deque
BuildMaxHeap (std::deque
&ideq){ std::deque
heap (ideq); for (int i = ideq.size () / 2 - 1; i > -1; --i) { MaxHeapify (heap, i); } return std::move (heap);}void HeapSort (std::deque
&ideq){ auto heap = BuildMaxHeap (std::move(ideq)); for (int i = ideq.size () - 1; i > -1; --i) { ideq[i] = std::move (heap[0]); heap.pop_front (); MaxHeapify (heap, 0); }}int HeapMaximum (std::deque
&heap){ const int topValue = heap[0]; return std::move(topValue);}int HeapExtractMax (std::deque
&heap){ if (heap.empty()) { std::cerr << "heap overfow!\n"; } int max = std::move(heap[0]); heap.pop_front (); MaxHeapify (heap, 0); return std::move (max);}void HeapIncreaseKey (std::deque
&heap, int &&node, int &&key){ if (key < heap[node]) { std::cerr << "This key is smaller than current key!\n"; } heap[node] = key; int parentNode = 0; while (( node > 0) && (parentNode = Parent(node), heap[parentNode] < key)){ std::swap (heap[parentNode], heap[node]); node = parentNode; }}void MaxHeapInsert (std::deque
&heap, int key){ heap.push_back (std::move(std::numeric_limits
::min())); HeapIncreaseKey (heap, heap.size() - 1, std::move(key));}void Print (const std::deque
&ideq){ for (const auto &elem : ideq) { std::cout << elem << " "; }}int main (){ std::ios::sync_with_stdio (false); std::deque
ideq{ 5, 13, 2, 25, 7, 17, 20, 9, 4}; auto maxHeap = BuildMaxHeap (ideq); HeapIncreaseKey (maxHeap, 0, 30); HeapIncreaseKey (maxHeap, maxHeap.size() - 1, 40); MaxHeapInsert (maxHeap, 35); Print (maxHeap); std::cout << std::endl; return 0;}

当然还有许多需要改进的地方, 还希望看官多提意见哈~

泛型的话还需要把 Less<_Ty>(_Ty lhs, _Ty rhs) 抽象出来, 甚至还有 Left<_Ty>(_Ty index), Right<_Ty>(_Ty index) 和 Parent<_Ty>(_Ty) 也要抽象出来. 只是这个博客的目的还是复习这个算法, 所以不作过多讨论.

当然要只是纯粹练习算法, 还是 python 更爽一些......

而且我不会说 STL 有个 priority_queue<type> 的......

转载于:https://www.cnblogs.com/wuOverflow/p/4154563.html

你可能感兴趣的文章
由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射...
查看>>
(转)结构体中使用string所引发的问题
查看>>
Linux查看网卡流量(转)
查看>>
论文修改(1)
查看>>
[javaEE] web应用的目录结构&配置虚拟主机
查看>>
[PHP] 数据结构-反转链表PHP实现
查看>>
MySQL 如何利用一条语句实现类似于if-else条件语句的判断
查看>>
jQuery和Zepto冲突问题【解决】
查看>>
machinekey生成工具 v1.0 官方最新版
查看>>
http server v0.1_mime.c
查看>>
open files
查看>>
MVC ——RouteTable.Routes的使用
查看>>
玩转X-CTR100 | STM32F4 l X-Assistant串口助手控制功能
查看>>
TCP/IP学习笔记1--概述,分组交换协议
查看>>
深入百度外链工具引发的思考
查看>>
DataBindings 与 INotifyPropertyChanged 实现自动刷新 WinForm 界面
查看>>
VB中数据占几个字节
查看>>
交通压力主动感知系统
查看>>
对于技术服务和业务的思考
查看>>
数据链路层
查看>>