当前位置: 首页 > web >正文

堆排序的C++相关实现

大根堆的实现

#include <iostream>
#include <vector>
using namespace std;// 调整堆,确保以i根节点的子树满足大根堆
void heapify(vector<int>& vec, int n , int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < n && vec[left] > vec[largetst]) {largest = left;}if (right < n && vec[right] > vec[largetst]) {largest = right;}if (largetst != i) {swap(vec[largest], vec[i]);heapify(vec, n, largest);}
}void sort(vector<int>& vec) {int n = vec.size();for (int i=(n-1)/2; i>=0; --i) {heapify(vec, n, i);}for (int i=n-1; i>=0; --i) {swap(vec[0], vec[i]);heapify(vec, i, 0);}
}
int main() {vector<int> vec = {4,5,6,7,1,9,0};sort(vec);for (auto v: vec) {cout<<v<<" ";}   
}

优先队列,大根堆的实现

#include <iostream>
#include <vector>
using namespace std;class PriorityQueue {
private:vector<int> heap;// 调整堆,从下到上void heapifyUp(int index) {while (index > 0) {int parent = (index - 1) / 2;if (heap[index] > heap[parent]) {swap(heap[index], heap[parent]);index = parent;} else {break;}}}// 调整堆,从上到下void heapifyDown(int index) {int size = heap.size();while (index < size) {int largest = index;int left = 2 * index + 1;int right = 2 * index + 2;if (left < size && heap[left] > heap[largest]) {largest = left;}if (right < size && heap[right] > heap[largest]) {largest = right;}if (largest != index) {swap(heap[largest], heap[index]);index = largest;} else {break;}}}public:void push(int val) {heap.push_back(val);heapifyUp(heap.size() - 1);}void pop() {if (heap.empty()) {std::cerr << "queue empty" << std::endl;return;}swap(heap[0], heap[heap.size()-1]);heapifyDown(0);}int top() {if (heap.empty()) {std::cerr << "queue empty" << std::endl;return -1;}return heap[0];}bool empty() {return heap.empty();}};int main() {PriorityQueue pq;pq.push(10);pq.push(20);pq.push(15);pq.push(30);pq.push(40);std::cout << "优先队列的顶部元素: " << pq.top() << std::endl; // 输出最大元素pq.pop(); // 删除最大元素std::cout << "删除最大元素后,顶部元素: " << pq.top() << std::endl;return 0;
}
http://www.xdnf.cn/news/627.html

相关文章:

  • Java编程基础(第四篇:字符串初次介绍)
  • 51单片机的原理图和PCB绘制
  • C++项目 —— 基于多设计模式下的同步异步日志系统(5)(建造者模式)
  • 【条形码识别改名工具】如何批量识别图片条形码,并以条码内容批量重命名,基于WPF和Zxing的开发总结
  • Spring之我见 - Spring Boot Starter 自动装配原理
  • 数字图像处理知识点小记1
  • 【Oracle专栏】删除用户 释放表空间
  • 注意力机制(np计算示例)单头和多头
  • 2025.4.14-2025.4.20学习周报
  • UCSC CTF 2025|MISC
  • (学习总结34)Linux 库制作与原理
  • Python Web开发常用框架介绍
  • SSM--AOP 日志
  • maven的安装与配置、IDEA集成maven
  • Redis 事件循环(Event Loop)
  • 主机运行状态的监控命令(top命令)
  • python——字典
  • Opencv图像处理:模板匹配对象
  • Python小游戏:俄罗斯方块简易版三
  • skywalking agent 关联docker镜像
  • 关于AI:记忆、身份和锁死
  • 【MySQL】MySQL的基础语法及其语句的介绍
  • Qt6离线安装过程
  • 在win上安装Ubuntu安装Anaconda(linx环境)
  • React 自定义Hook之usePrevious
  • CFS 的调度类型:普通调度 vs 组调度
  • 【中级软件设计师】语言处理程序(汇编程序、解释程序、编译程序)附软考真题
  • go语言优雅关机和优雅重启笔记
  • WEMOS LOLIN32
  • 第一部分笔试Day_01到Day24_每天两道OJ