- . 堆排序
【问题描述】请用堆排序的方法对一组数据进行排序,并给出建堆以及每一趟堆排序的结果。
【输入形式】一组数据,以0作为输入的结束。
【输出形式】建大根堆的结果,以及每一趟堆排序的结果。
【样例输入】
8 3 6 1 68 12 0
【样例输出】
68 8 12 1 3 6
12 8 6 1 3 68
8 3 6 1 12 68
6 3 1 8 12 68
3 1 6 8 12 68
1 3 6 8 12 68
【样例输入】
12 9 26 11 38 52 99 27 66 15 32 0
【样例输出】
99 66 52 27 38 12 26 9 11 15 32
66 38 52 27 32 12 26 9 11 15 99
52 38 26 27 32 12 15 9 11 66 99
38 32 26 27 11 12 15 9 52 66 99
32 27 26 9 11 12 15 38 52 66 99
27 15 26 9 11 12 32 38 52 66 99
26 15 12 9 11 27 32 38 52 66 99
15 11 12 9 26 27 32 38 52 66 99
12 11 9 15 26 27 32 38 52 66 99
11 9 12 15 26 27 32 38 52 66 99
9 11 12 15 26 27 32 38 52 66 99
#include <iostream>
using namespace std;
void heapify(int *arr, int n, int i)
{
int largest = i;
int l = 2 * i + 1, r = 2 * i + 2;
if (arr[l] > arr[largest] && l < n)
largest = l;
if (arr[r] > arr[largest] && r < n)
largest = r;
if (i != largest)
{
swap(arr[i], arr[largest]);
heapify(arr, n, largest);
}
}
void print(int *arr, int n)
{
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
}
void create_and_sort(int *arr, int n)
{
for (int i = n / 2 - 1; i >= 0; i--)
heapify(arr, n, i);
print(arr, n);
for (int i = n - 1; i > 0; i--)
{
swap(arr[i], arr[0]);
heapify(arr, i, 0);
print(arr, n);
}
}
int main()
{
int a[500];
int len = 0;
while (1)
{
int data;
cin >> data;
if (data)
{
a[len++] = data;
}
else
break;
}
create_and_sort(a, len);
}