码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序

时间:2015-08-21 19:35:26      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:排序   堆排序   

堆排序的堆不是指内存区域里面的堆,而是一种数据结构。堆可以分为“大顶堆”和“小顶堆”,堆其实是一种特殊的二叉树,“大顶堆”中根元素总比叶子元素大,“小顶堆”中根元素总比叶子节点小。当然要创建这样的堆结构还是有一定难度的,请自行参考其他资料。
这里我们使用到的是 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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!