#include <iostream>
using namespace std;
template<typename T>
void heapify(T *arry,int size,int element, bool dec)
{
int lchild=element*2+1,rchild=lchild+1;//左右子樹
if(dec) {
while(rchild<size)//子樹均在範圍內
{
//如果比左右子樹都小,完成整理
if(arry[element]<=arry[lchild]&&arry[element]<=arry[rchild])
{
return;
}
if(arry[lchild]<=arry[rchild])//如果左邊最小
{
//把左面的提到上面
swap(arry[element],arry[lchild]);
//循環時整理子樹
element=lchild;
}
else//否則右面最小
{
swap(arry[element],arry[rchild]);//同理
element=rchild;
}
lchild=element*2+1;
rchild=lchild+1;//重新計算子樹位置
}
if(lchild<size&&arry[lchild]<arry[element])//只有左子樹且子樹小於自己
{
swap(arry[lchild],arry[element]);
}
}
else {
while(rchild<size)//子樹均在範圍內
{
if(arry[element]>arry[lchild]&&arry[element]>arry[rchild])
{
return;
}
if(arry[lchild]>arry[rchild])//如果左邊最小
{
swap(arry[element],arry[lchild]);
element=lchild;
}
else
{
swap(arry[element],arry[rchild]);//同理
element=rchild;
}
lchild=element*2+1;
rchild=lchild+1;
}
if(lchild<size&&arry[lchild]>=arry[element])
{
swap(arry[lchild],arry[element]);
}
}
return;
}
template<typename T>
void heap_sort(T *arry,int size, bool dec = true)
{
int i;
//從子樹開始整理樹
for(i=size-1;i>=0;i--)
{
heapify(arry,size,i, dec);
}
while(size>0)//拆除樹
{
swap(arry[size-1],arry[0]);//將根(最小)與數組最末交換
size--;//樹大小減小
heapify(arry,size,0, dec);//整理樹
}
return;
}
int main()
{
int size;
cin >> size;
int *arr = new int[size];
for(int i = 0; i < size; ++ i)
cin >> *(arr+i);
heap_sort(arr, size, false);
for(int i = 0; i < size; ++ i)
cout << *(arr + i) << " ";
cout << endl;
}
常用排序算法——堆排序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.