堆,优先队列

来源:互联网 发布:个性签名 知乎 编辑:程序博客网 时间: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
原创粉丝点击