对n个数,要求用堆排序(最大堆)对其进行排序。
输入格式:
第一行一个n(n<1000)。第二行给出n个数。
输出格式:
输出n行,每行n个数。第一行表示将n个数(将n个数看成一棵树)变成最大堆后的结果,第二行表示将上次结果的根节点交换到现有节点的最后一个节点(然后将除最后一个节点的数看成一颗树),然后将该剩余节点树从新变成最大堆后的结果输出(包括交换到最后的节点),依次类推。
输入样例:
6
7 1 6 4 3 5
输出样例:
7 4 6 1 3 5
6 4 5 1 3 7
5 4 3 1 6 7
4 1 3 5 6 7
3 1 4 5 6 7
1 3 4 5 6 7
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define MAXDATA 1000
void Swap(int* a, int* b) {
int temp = *a; *a = *b; *b = temp;
}
void PrecDown(int A[],int p,int N) {
int X,Parent,Child;
X = A[p];
for (Parent = p; Parent * 2 <= N; Parent = Child) {
Child = Parent * 2;
if ((Child < N) && (A[Child] < A[Child + 1]))
Child++;
if (X > A[Child])break;
else
A[Parent] = A[Child];
}
A[Parent] = X;
}
void HeapSort(int A[],int N) {
int i, j;
for (i = N / 2; i >= 1; i--)
PrecDown(A, i, N);
for (i = 1; i <= N; i++) {
printf("%d", A[i]);
if (i != N)printf(" ");
}
printf("\n");
for (i = N; i >= 2; i--) {
Swap(&A[1], &A[i]);
PrecDown(A, 1, i - 1);
for (j = 1; j <= N; j++) {
printf("%d", A[j]);
if (j != N)printf(" ");
}
printf("\n");
}
}
int main() {
int A[MAXDATA],N,i;
scanf("%d", &N);
for (i = 1; i <= N; i++)
scanf("%d", &A[i]);
HeapSort(A, N);
system("pause");
return 0;
}