堆排序 維護最大堆 建立最大堆 排序最大堆
阿新 • • 發佈:2019-02-19
/*
函式:堆排序
建立最大堆
維護最大堆
排序最大堆
通過陣列儲存二叉樹
時間: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;
}