PTA-7-4 堆排序

发布时间:2024年01月15日

代码如下:

#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);
	}
}

文章来源:https://blog.csdn.net/2302_81149370/article/details/135609850
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。