1. 程式人生 > >堆排序 維護最大堆 建立最大堆 排序最大堆

堆排序 維護最大堆 建立最大堆 排序最大堆

/*
函式:堆排序
建立最大堆
維護最大堆
排序最大堆
通過陣列儲存二叉樹


時間:15.7.14
Jason Zhou  
熱愛你所寫下的程式,他是你的夥伴,而不是工具.
*/


#include<iostream>
using namespace std;

//交換兩個元素
int swap_data(int &a,int &b)
{

    int tmp=a;
    a=b;
    b=tmp;
    return 0;
}

//維護堆的性質
int max_heapify(int arr[],int i,int len)
{


    //和子節點的最大值進行比較.比最大值大,不交換.否則和最大值交換
int l=2*i+1; int r=2*i+2; int largest=i; if (l<=len && arr[l]>arr[i]) { largest=l; } else { largest=i; } if (r<=len && arr[r]>arr[largest] ) { largest=r; } if (largest!=i) { swap_data(arr[i],arr[largest]); max_heapify(arr,largest,len); } return
0; } //建隊過程 int build_max_heap(int a[],int len) { for (int i=(len-1)/2;i>=0;i--) { max_heapify(a,i,len-1); } return 0; } //堆排序 int heap_sort(int arr[],int len) { //首先建立最大堆 build_max_heap(arr,len); for (int i=(len-1);i>0;i--) { swap_data(arr[0],arr[i]);//每次將最大值換到最後,然後讓 arr[0..i-1] 構建最大堆
max_heapify(arr,0,i-1); } return 0; } int main() { int data[13]={8,5,4,6,13,7,1,9,12,11,3,10,2}; int len=sizeof(data)/sizeof(data[0]); cout<<"原始資料"<<endl; for (int i=0;i<len;i++) { cout<<data[i]<<" "; } cout<<endl; build_max_heap(data,len);//建立最大堆 cout<<"建立最大堆"<<endl; for (int i=0;i<len;i++) { cout<<data[i]<<" "; } cout<<endl; heap_sort(data,len); cout<<"堆排序"<<endl; for (int i=0;i<len;i++) { cout<<data[i]<<" "; } cout<<endl; return 0; }

這裡寫圖片描述