#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;
}
常用排序算法——堆排序
最新推荐文章于 2022-04-08 18:43:57 发布