用优先队列可以实现堆排。
#include <iostream>
using namespace std;
/*
优先队列.数组下标从1开始。[1,n]
*/
template <typename T>
class priqueue {
public:
priqueue(int m):n(0) {
maxsize = m;
Arr = new int[maxsize + 1];
}
T extractmin();
void insert(T x);
void siftup(int n);//自下向上调整
void siftdown(int n);//从上往下调整
void debug();//用于调试,显示信息
~priqueue() {delete[] Arr;}
private:
T *Arr;
int n, maxsize;
inline void _swap(int i, int j) {
int tmp = Arr[i];
Arr[i] = Arr[j];
Arr[j] = tmp;
}
};
//构建小顶堆
template <typename T>
void priqueue<T>::siftup(int n) {
int i, j;
i = n;
while(1) {
if(i == 1) break;
j = i/2;
if(Arr[j] > Arr[i]) _swap(i, j);
i = j;
}
}
template <typename T>
void priqueue<T>::siftdown(int n) {
int i, j;
i = 1;
while(1) {
if(i >= n) break;
j = 2*i;
if(j+1 <= n && Arr[j] > Arr[j+1]) j++;//找出较小者
if(Arr[i] < Arr[j]) break;
_swap(i, j);
i = j;
}
}
//插入一个元素
template <typename T>
void priqueue<T>::insert(T t) {
n++;
Arr[n] = t;
siftup(n);
}
template <typename T>
T priqueue<T>::extractmin() {
T t = Arr[1];
Arr[1] = Arr[n];
n--;
siftdown(n);
return t;
}
template <typename T>
void priqueue<T>::debug() {
int i = 1;
while(i <= n) cout << Arr[i++] << " ";
cout << endl;
}
int main()
{
//用优先队列实现堆排
int n;
while(cin >> n) {
if(n == 0) break;
priqueue<int> que(n);
int i, x;
for(i=0; i<n; i++) {
cin >> x;
que.insert(x);
}
for(i=0; i<n; i++) cout << que.extractmin() << " ";
cout << endl;
}
//堆排
/*
for i=[2,n]
siftup(i);
for i=[n,2]
_swap(1,i);
siftdown(i-1);
*/
return 0;
}