构建最小堆 | ||
---|---|---|
Time Limit: 5000 MS | Memory Limit: 1000 KB |
Description
将数组按自下向上扫描,向下调整的方法,调整为最小堆
Input
第一行一个int型整数T(T<=10),代表一共有T组数据。
对于每组数据,输入一个整数n(n<=1000)和n个整数m(m<=1000)。
Output
输出T行, 每行包括一个序列, 代表该数组调整为最小堆后的序列。(每个相邻数据用空格隔开,每个序列结尾无多余的空格)
Sample Input
2
8 53 17 78 9 45 65 87 23
10 23 54 76 33 89 12 78 34 87 10
Sample Output
9 17 65 23 45 78 87 53
10 23 12 33 54 76 78 34 87 89
结果代码:
#include<iostream>
using namespace std;
int main()
{
int T = 0;
cin >> T;
for (int t = 0; t < T; t++)
{
int n = 0;
cin >> n;
int MinHeap[2001];
int pos = 0;
for (int i = 0; i < n; i++)
{
int m = 0;
cin >> m;
MinHeap[i] = m;
}
for (int i = n; i < 2001; i++)
{
MinHeap[i] = 1000;
}
for (int i = n-1; i >= 0; i--)
{
int pos = i;
MinHeap[i];
if ((pos * 2 + 2) < n)
{
while ( MinHeap[pos * 2 + 1] <MinHeap[pos]|| MinHeap[pos * 2 + 2] < MinHeap[pos])
{
if (MinHeap[pos * 2 + 1] <= MinHeap[pos * 2 + 2])
{
int temp = MinHeap[pos];
MinHeap[pos] = MinHeap[pos * 2 + 1];
MinHeap[pos * 2 + 1] = temp;
pos = pos * 2 + 1;
}
else
{
int temp = MinHeap[pos];
MinHeap[pos] = MinHeap[pos * 2 + 2];
MinHeap[pos * 2 + 2] = temp;
pos = pos * 2 + 2;
}
}
}
else if ((pos * 2 + 1) < n)
{
if (MinHeap[pos * 2 + 1] < MinHeap[pos])
{
int temp = MinHeap[pos];
MinHeap[pos] = MinHeap[pos * 2 + 1];
MinHeap[pos * 2 + 1] = temp;
}
}
}
for (int i = 0; i < n; i++)
{
if (i != n - 1)cout << MinHeap[i] << " ";
else cout << MinHeap[i] << endl;
}
}
return 0;
}