//堆排序算法
#include <iostream>
#define PARENT(i) i>>1;
#define LEFT(i) i<<1;
#define RIGHT(i) (i<<1)+1
using namespace std;
// int PARENT(int i) {return i/2;}
// int LEFT(int i) {return i*2;}
// int RIGHT(int i) {return i*2+1;}
void MAX_HEAPIFY(int A[],int heap_size,int i) //维护堆的性质
{
int l,r;
l=LEFT(i);
r=RIGHT(i);
int largest;
if(l<=heap_size && A[l]>A[i]) largest=l;
else largest=i;
if(r<=heap_size && A[r]>A[largest]) largest=r;
if(largest != i)
{
int temp;
temp=A[largest];
A[largest]=A[i];
A[i]=temp;
MAX_HEAPIFY(A,heap_size,largest);
}
return ;
}
void BUILD_MAX_HEAP(int A[],int heap_size) //建立一个最大堆
{
for(int i=heap_size/2;i>0;i--)
{
MAX_HEAPIFY(A,heap_size,i);
}
return ;
}
void HEAP_SORT(int A[],int heap_size) //堆排序
{
BUILD_MAX_HEAP(A,heap_size);
int temp_heap=heap_size;
for(int i=heap_size;i>1;i--)
{
int temp=A[1];
A[1]=A[temp_heap]; A[temp_heap]=temp;
temp_heap=temp_heap-1;
MAX_HEAPIFY(A,temp_heap,1); //第一个数和最后一个数交换后,调用维护堆的性质,仍为一个最大堆
}
}
int main(int argc, char *argv[])
{
int n;
cin>>n;
int a[n+1];
for(int i=1;i<n+1;i++) cin>>a[i];
int heap_size=n;
HEAP_SORT(a,heap_size);
for(int i=1;i<n+1;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
cout << "Hello World!" << endl;
return 0;
}
堆排序算法
最新推荐文章于 2024-04-28 11:24:41 发布