堆排序
今天课上学的堆排序。
#include<bits/stdc++.h>
using namespace std;
void HeapAdjust(int a[],int i,int len)
{
if(i>len/2)//大于len/2的是叶子结点,不用调整
return ;
int m = i;
if((i<<1)<=len)
m = a[i]>a[i<<1] ? i : i<<1;
if((i<<1|1)<=len)
m = a[m]>a[i<<1|1] ? m : i<<1|1;
//在左右子节点中找出最大值的下标
if(m!=i)
{
swap(a[i],a[m]);
HeapAdjust(a,m,len);//保证交换后的子树仍能构成堆
}
}
void BuildHeap(int a[],int len)
{
int i = len>>1;//非叶节点最大序号值为len/2
while(i)
HeapAdjust(a,i--,len);
}
void HeapSort(int a[],int len)
{
BuildHeap(a,len);//此时a[1]是最大值
int i = len;
while(i)
{
swap(a[1],a[i]);//a[1]放到最后,进入有序区
HeapAdjust(a,1,i---1);//堆的大小减1
}
}
int N,a[1000];
int main()
{
while(scanf("%d",&N)!=EOF)
{
for(int i=1;i<=N;++i)
scanf("%d",&a[i]);
HeapSort(a,N);
for(int i=1;i<=N;++i)
printf("%d%c",a[i],i==N?'\n':' ');
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步