假设要求从小到大排序
对序列a[n]
1、建立初始大顶堆。
2、输出堆顶元素,即交换a[0]和a[n-1],此时a[n-1]是最大的元素。
有序区为[n-1, n-1],无序区为[0,n-2]。
3、无序区堆结构被破坏,重新调整后再输出堆顶元素。
4、重复2~3,直到无序区只有1个元素。
附简单的C++代码
#include <iostream>
#include <vector>
using namespace std;
#define SWAP_INT(a, b) do{int tmp = a; a = b; b = tmp;}while(0);
class HeapSort
{
public:
HeapSort(vector<int> &a)
{
for(vector<int>::iterator it= a.begin(); it != a.end(); ++it)
{
data.push_back(*it);
}
}
void heapAjust(int i, int N)
{
if(i*2+1 >= N )
return;
else
{
if(data[i] < data[i*2+1])
{
SWAP_INT(data[i], data[i*2+1]);
heapAjust(i*2+1, N);
}
}
if(i*2+2 < N)
{
if(data[i] < data[i*2+2])
{
SWAP_INT(data[i], data[i*2+2]);
heapAjust(i*2+2, N);
}
}
}
void buildHeap()
{
int N = data.size();
for(int i = N/2; i>=0; --i)
heapAjust(i, N);
}
void sortInHeap()
{
int N = data.size();
for(int i = N-1; i>0; i--)
{
SWAP_INT(data[0], data[i]);
heapAjust(0, i);
}
}
void sort()
{
buildHeap();
sortInHeap();
}
void print()
{
for(vector<int>::iterator it= data.begin(); it != data.end(); ++it)
{
cout <<*it<<" ";
}
cout<<endl;
}
private:
vector<int> data;
};
int main()
{
int a[18] = {20,0,5,9,13,19,42,6,34,7,33,14,65,14,65,13,67,29};
vector<int> data(a, a+18);
HeapSort h(data);
cout<<"Before sorting, array is:"<<endl;
h.print();
h.sort();
cout<<"After sorting, array is:"<<endl;
h.print();
return 0;
}
堆排序是不稳定的,要想保证稳定性,使用元组(a[i], i)进行比较就好。