//堆排序 不稳定
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
//排序为从小到大,建立最大堆排序
//且因为数组的缘故,此处的堆和之前的不一样,之前均第一个节点编号为1
//此处为0,满足leftchild=parent*2+1,rightchild=parent*2+2
//由child找parent:
//当节点编号为奇数(即为左儿子):parent=(child-1)/2
//当节点编号为偶数(即为右儿子):parent=(child-2)/2
void PrecDown(int array[],int i,int n)//下滤
{
int child,j;
int number=array[i];
for(j=i;2*j+1<n;j=child){
child=2*j+1;
if(child+1<n&&array[child+1]>array[child])
child++;
if(number<array[child])
array[j]=array[child];
else
break;
}
array[j]=number;
return;
}
void HeapSort(int array[],int n){//堆排序
//建堆
int start;//找第一个开始下滤的点
if(n==1)
return;
if(n%2==1)
start=(n-3)/2;
else
start=(n-2)/2;
//以上找第一个开始下滤的点可替换为:
//int start=n/2-1;
for(int i=start;i>=0;i--)
PrecDown(array,i,n);
for(int i=n-1;i>=1;i--){
swap(array[0],array[i]);
PrecDown(array,0,i);
}
return;
}
int main(){
int n;
cin>>n;
int array[n];
for(int i=0;i<n;i++)
cin>>array[i];
HeapSort(array,n);
for(int i=0;i<n;i++)
cout<<array[i]<<(i==n-1?'\n':' ');
return 0;
}
堆排序
最新推荐文章于 2024-06-09 16:03:45 发布