以buttom-up方式建立Heap 在O(n)時間內完成

少於 1 分鐘閱讀

以兩個function構成
Heapify調整以該node為root為子樹的subtree成heap
Build Heap依序從最後一個parent回調到root

#include<iostream>
#include<stdio.h>
#include <algorithm>    // std::swap
using namespace std;
int arr[11]={1,3,5,4,6,13,10,9,8,15,17};
//complete tree
//            1
//         /     \
//        3       5
//      /  \     / \
//     4    6   13  10
//    / \  / \  
//   9  8 15 17
void heapify(int* arr,int n,int i){
    int root=i;
    int l=i*2+1;
    int r=i*2+2;
    if(l<n && arr[l]>arr[root]){
        root=l;
    }

    if(r<n && arr[r]>arr[root]){
        root=r;
    }

    if(root!=i){
        swap(arr[i],arr[root]);
        heapify(arr,n,root);
    }
}

void buildheap(int *arr,int n){
    int lastparent=(n/2)-1;
    for(int i=lastparent;i>=0;i--){
        heapify(arr,n,i);
    }
}
void printheap(int *arr,int n){
    int next=1;
    for(int i=0;i<n;i++){
        cout<<arr[i]<<"\t";
        if(i+1==next){
            cout<< endl;
            next=next*2+1;
        }
    }
    cout<<endl;
}
int main(){
    int n=11;
    buildheap(arr,n);
    printheap(arr,n);

}

留言