堆排序的堆不是指内存区域里面的堆,而是一种数据结构。堆可以分为“大顶堆”和“小顶堆”,堆其实是一种特殊的二叉树,“大顶堆”中根元素总比叶子元素大,“小顶堆”中根元素总比叶子节点小。当然要创建这样的堆结构还是有一定难度的,请自行参考其他资料。
这里我们使用到的是 STL 中的 priority_queue< T> 这个结构,这个默认就是一个“大顶堆”,所以用这个数据结构我们来实现排序就很简单了。
代码:
#pragma region 堆排序
struct big
{
bool operator()(const int &t1, const int &t2)
{
return t1 < t2;//大顶堆
}
};
struct small
{
bool operator()(const int &t1, const int &t2)
{
return t1 > t2;//小顶堆
}
};
void heapSort(int arr[], int len)
{
priority_queue<int,vector<int>,small> pq;
for (int i = 0; i < len; ++i)
{
pq.push(arr[i]);
}
for (int i = 0; i < len; ++i)
{
arr[i] = pq.top();
pq.pop();
}
}
#pragma endregion
注意在创建堆结构的时候, priority_queue<int,vector<int>,small> pq;
,使用自定义结构 small 或者 big 可以指定堆为大顶堆还是小顶堆。我们要从小到大排序,所以这里使用的是小顶堆。
由于使用到了 priority_queue 结构,排序过程很简单,就是将数组元素依次读入到 小顶堆中(注意这里构造小顶堆二叉树过程 priority_queue 已经帮我们完成),然后再将顶上元素依次放入到数组中,就已经排好序了。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u013647382/article/details/47838261