堆,優先隊列

用最大堆實現排序

#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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章