例题学堆排序

在这里插入图片描述

建立最大堆

void BuildBigHeap(int n)
{
	for (int i = n; i >= 1; i--)
		JustifyHeap(i, n);
}
void JustifyHeap(int beg, int n)
{
	int i = beg, j = 2 * i;
	while (j <= n)
	{
		if (j + 1 <= n && occ[j] < occ[j + 1]) j++;
		if (occ[i] < occ[j]) swap(occ[i], occ[j]);
		i = j;
		j = 2 * i;
	}
}

完整代码

//直输入排在前面的M位大富翁,采用堆排序比较好,时间复杂度是O(nlogn)
#include<iostream>
#include<algorithm>
using namespace std;
int occ[1000005];
void BuildBigHeap(int n);
void JustifyHeap(int beg, int n);
int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> occ[i];
	if (n < m) m=n;
	BuildBigHeap(n);
	for (int i = n; i >= n - m + 1; i--)
	{
		if (i != n) {
			cout << " ";
			JustifyHeap(1, i);
		}
		cout << occ[1];
		swap(occ[1], occ[i]);
	}
	return 0;
}
void BuildBigHeap(int n)
{
	for (int i = n; i >= 1; i--)
		JustifyHeap(i, n);
}
void JustifyHeap(int beg, int n)
{
	int i = beg, j = 2 * i;
	while (j <= n)
	{
		if (j + 1 <= n && occ[j] < occ[j + 1]) j++;
		if (occ[i] < occ[j]) swap(occ[i], occ[j]);
		i = j;
		j = 2 * i;
	}
}

堆排序图解:
在这里插入图片描述
图片转自

posted on 2021-06-19 13:38  不依法度  阅读(78)  评论(0)    收藏  举报

导航