代码如下:
#include<iostream>
using namespace std;
void change(int arr[], int n, int i);
int main()
{
int n,i,end,arr[1000];
cin >> n;
for (i = 0; i < n; i++)
{
cin >> arr[i];
}
//进行一次排序,把最大值放到顶端
for (i = n/2-1; i >= 0; i--)
{
change(arr, n, i);
}
for (i = 0; i < n; i++)
{
cout << arr[i]<<' ';
}
cout << endl;
end = n - 1;
while (end > 0)
{
//交换首尾的值
int m;
m = arr[0];
arr[0] = arr[end];
arr[end] = m;
//进行一次排序,将(除上一次找出的)最大值放到顶端
change(arr, end, 0);
//遍历元素减一
end--;
for (i = 0; i < n; i++)
{
cout << arr[i]<<' ';
}
cout << endl;
}
return 0;
}
void change(int arr[], int n, int i)
{
//max记录主干的下标,left,right记录树叶的下标
int max = i, left = i * 2 + 1, right = i * 2 + 2;
//如果树叶下标在数组范围内并且比主干大,将max更新为最大的树叶下标
if (right < n && arr[right] > arr[max])
max = right;
if (left < n && arr[left] > arr[max])
max = left;
//如果max与主干下标i的值不相等,交换,并且以被交换的树叶为新的主干,向下检查,保证每个主干的值大于树叶
if (max != i)
{
int m;
m = arr[i];
arr[i] = arr[max];
arr[max] = m;
change(arr, n, max);
}
}