#include<iostream>
using namespace std;
const int maxn = 100001;
int Parent(int i)
{
return i / 2;
}
int Left(int i)
{
return 2 * i;
}
int Right(int i)
{
return 2 * i + 1;
}
void Max_heapify(int *a,int i,int heap_size)
{
int largest;
int temp;
int l = Left(i);
int r = Right(i);
if(l <= heap_size && a[l] > a[i]) //如果左结点大于父结点,那么l为目前的最大值
{
largest = l;
}
else
{
largest = i; //否则父结点置为当前的最大值
}
if(r <= heap_size && a[r] > a[largest]) //如果右结点大于当前的最大值那么,右结点置为新的最大值
{
largest = r;
}
if(largest != i) //如果左右结点大于父结点,那么与父结点交换位置
{
temp = a[i];
a[i] = a[largest];
a[largest] = temp;
Max_heapify(a,largest,heap_size); //交换后继续从子结点递归
}
}
void Build_Max_Heap(int *a,int size) //建堆操作
{
int len = size;
for(int i=size/2;i>=1;i--)
{
Max_heapify(a,i,size); //对非叶子结点调用递归
}
}
void HeapSort(int *a,int size) //堆排序
{
Build_Max_Heap(a,size);
for(int i=size;i>=2;i--)
{
int temp;
temp = a[1];
a[1] = a[i];
a[i] = temp;
size--;
Max_heapify(a,1,size);
}
}
int main()
{
int a[maxn];
int m;
cout<<"一共需要排序的个数:"<<endl;
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>a[i];
}
HeapSort(a,m);
cout<<"排序后的结果为:"<<endl;
for(int i=1;i<=m;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
最大堆实现堆排序
最新推荐文章于 2023-05-28 11:19:59 发布