//堆排序
#include <cstdio>
using namespace std;
#define MAX_NUM 1050
int data[MAX_NUM];
void swap2(int *a , int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void adjust(int node , int N)
{
int start = node*2 ;
int left = start+1;
int right = start+2;
int max = start ;
//不要越界
if(left<N && data[left]>data[max])
{
max = left;
}
if(right<N && data[right]>data[max])
{
max = right;
}
if(max!=start)
{
//交换
swap2(&data[max] , &data[start]);
//继续调整以孩子为父节点的子树
adjust(max , N);
}
}
int main(void)
{
int N ;
int i ;
#ifdef DEBUG
freopen("input.txt" , "r" , stdin);
freopen("output.txt" , "w" , stdout);
#endif
scanf("%d" , &N);
for( i =0 ; i<N; i++)
{
scanf("%d" , &data[i]);
}
//堆排序开始~
for(i=(N-1)/2 ; i>=0 ; i--)
{
adjust(i , N);
}
//开始输出
for(i=N-1 ; i>=0 ; i--)
{
int j ;
swap2(&data[0] , &data[i]);
adjust( 0 , i);
for( j =0 ; j<N ; j++)
{
printf("%d " , data[j]);
}
printf("\n");
}
return 0;
}
排序——堆排序
最新推荐文章于 2024-02-06 19:28:39 发布