堆,优先队列
来源:互联网 发布:个性签名 知乎 编辑:程序博客网 时间:2024/05/29 04:44
用最大堆实现排序
#include<iostream> // Myself 15-9-26 update Adjust_Heap_2() 15-10-29#include<cstdio>using namespace std;void Adjust_Heap(int* a,int i,int n) { // 调整最大堆 递归方法 if (i > n/2) return ; // 叶子节点 无需调整 int le = i<<1; int ri = i<<1|1; int Max = i; if (le <= n && a[le] > a[Max]) Max = le; if (ri <= n && a[ri] > a[Max]) Max = ri; if (Max != i) { swap(a[Max],a[i]); Adjust_Heap(a,Max,n); }}void Adjust_Heap_2(int* a,int i,int n)// 调整最大堆 非递归方法{ if (i > n/2) return ; int parent = i , child; int temp = a[i]; for (;parent <= n/2; parent = child) { child = parent<<1; if (child +1 <= n && a[child] < a[child + 1]) { child ++; // child指向值较大的孩子 } if (temp > a[child]) break; else a[parent] = a[child]; } a[parent] = temp;}void Build_Heap(int* a,int n) { // 建一个最大堆 for (int i = n/2;i > 0;i--) Adjust_Heap(a,i,n);}void Heap_sort(int* a,int n) // 堆排序{ Build_Heap(a,n); // 建堆 for (int i = n;i > 1;i--) { swap(a[i],a[1]); Adjust_Heap_2(a,1,i - 1); }}int main(){ int a[] = {0,7,1,5,2,3,4,9,6,10,8}; int n = 10; //cin>>n; //for(int i=1;i <= n;i++) cin>>a[i]; Heap_sort(a,n); for (int i = 1;i <= n;i++) cout<<a[i]<<" "; return 0;}
#include<iostream> // 优先级对列 priority_queue 最大优先队列 Myself 15-9-26#include<cstdio>using namespace std;void Adjust_Heap(int* a,int i,int n) { // 调整最大堆 if (i > n/2) return ; // 叶子节点 无需调整 int le = i*2; int ri = i*2+1; int Max = i; if (le <= n && a[le] > a[Max]) Max = le; if (ri <= n && a[ri] > a[Max]) Max = ri; if (Max != i) { swap(a[Max],a[i]); Adjust_Heap(a,Max,n); }}void Build_Heap(int* a,int n) { // 建一个最大堆 for (int i = n/2;i > 0;i--) Adjust_Heap(a,i,n);}/*void Heap_sort(int* a,int n) // 堆排序{ Build_Heap(a,n); for (int i = n;i > 1;i--) { swap(a[i],a[1]); Adjust_Heap(a,1,i - 1); }}*//**============*/int Maximun(int* a) { //返回最大值 return a[1];}int Extract_Max(int* a,int& n) { // 返回并去电最大元素 if (n <= 0) { cout<<"Extract Error"<<endl; return -1; } int Max = a[1]; a[1] = a[n]; n --; Adjust_Heap(a,1,n); return Max;}void Insert(int* a,int x,int& n) { // 增加一个元素 a[++n] = x; int i = n; int parent = i>>1 ; while (parent >= 1 && a[parent] < a[i] ) { //与父节点比较 swap(a[parent], a[i]); i = parent; parent = i>>1; }}void print(int *a,int n) { for (int i = 1;i <= n;i++) cout<<a[i]<<" "; cout<<endl;}int main(){ int a[1000] = {0,7,1,5,2,3,4,9,6,10,8}; int n = 10; //cin>>n; //for(int i=1;i <= n;i++) cin>>a[i]; Build_Heap(a,n);// 堆排序 print(a,n); cout<<Maximun(a)<<endl; print(a,n); cout<<Extract_Max(a,n)<<endl; print(a,n); Insert(a,11,n); print(a,n); return 0;}
0 0
- 堆和优先队列
- 堆和优先队列
- 优先队列--二叉堆
- 优先队列--堆
- 二叉堆/优先队列
- 优先队列(堆)
- 优先队列实现堆
- 堆 优先队列
- 优先队列(堆)
- 优先队列与堆
- 优先队列(堆)
- poj3253 堆/优先队列
- 优先队列 - 堆
- 优先队列(堆)
- 优先队列(堆)
- 堆,优先队列
- 堆和优先队列
- 优先队列(堆)
- linux grep命令详解
- 基于MSP430G2系列实现的步进电机控制
- PAT1004. Counting Leaves bfs
- mysql命令行
- 利用addChildViewController管理子视图控制器<2>
- 堆,优先队列
- android studio gradle 签名
- 计算一个数的二进制位中1的个数的方法总结
- Android中关于颜色的使用
- java学习笔记--类与接口
- 数据库连接池DBPool分析(五):Makefile
- WAMP Server多站点出现You don t have permission to access / on this server错误
- #SC2440虚拟地址到物理地址的转换
- 浅谈 C++ 中的 new/delete 和 new[]/delete[]