例题学堆排序

建立最大堆
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;
}
}
堆排序图解:

图片转自
浙公网安备 33010602011771号