【问题描述】
对一含有n个整数的数组,使用堆排序将其由小到大排序。
【输入形式】
第一行为元素个数n,第二行为n个整数(以空格隔开)。
【输出形式】
输出n个整数(以空格隔开)
【样例输入】
6 43 2 56 1 22 9
【样例输出】
1 2 9 22 43 56
【样例说明】
【评分标准】
此题目将人工检查,必须使用堆排序,其它排序方法不得分。
题解:
#include<stdio.h>
void HeadAdjust(int A[], int k, int len)
{
A[0] = A[k];
for (int i = 2 * k; i <= len; i = i * 2) {
if (i < len && A[i] < A[i + 1])
i++;
if (A[0] >= A[i])
break;
else
{
A[k] = A[i];
k = i;
}
}
A[k] = A[0];
}
void BuildMaxHeap(int A[], int len)
{
for (int i = len / 2; i > 0; i--)
HeadAdjust(A, i, len);
}
void HeapSort(int A[], int len)
{
BuildMaxHeap(A, len);
for (int i = len; i > 1; i--)
{
int temp;
temp = A[i];
A[i] = A[1];
A[1] = temp;
HeadAdjust(A, 1, i - 1);
}
}
int main()
{
int A[500],n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &A[i]);
}
HeapSort(A, n);
for(int i=1;i<=n;i++)
{
printf("%d ",A[i]);
}
return 0;
}