堆排序
来源:互联网 发布:python 词语相似度 编辑:程序博客网 时间:2024/05/16 07:45
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
template <typename T>
class Heap
{
public:
Heap<T>(const vector<T>& a)
{
m.assign(a.begin(),a.end());
//printArray(m);
}
template <typename Compare>
//comp 为less<Type> 则大数下沉,创建最小堆,从小到大排序
//comp 为greater<Type> 则小数下沉,创建最大堆,从大到小排序
void sort(Compare comp);
void printArray(const vector<T>& a);
private:
vector<T> m;
template <typename Compare>
void creatHeap(Compare comp);//创建堆
template <typename Compare>
void downElement(int i,Compare comp);//下沉元素
};
template <typename T>
template <typename Compare>
void Heap<T>::sort(Compare comp)
{
printArray(m);
creatHeap(comp);
vector<T> array;
for(int i = m.size()-1;i >= 0;i--)
{
array.push_back(m[0]);
swap(m[0],m[i]);
m.pop_back();
downElement(0,comp);
}
printArray(array);
m.assign(array.begin(),array.end());
}
template <typename T>
void Heap<T>::printArray(const vector<T>& a)
{
for(int i = 0;i < a.size();i++)
{
cout << a[i] << " ";
}
cout << endl;
}
template <typename T>
template <typename Compare>
void Heap<T>::creatHeap(Compare comp)
{
//从最后一个非叶子节点开始,将每个父节点都调整为最小堆
for(int i = m.size()/2 - 1;i >= 0;i--)
{
downElement(i,comp);
}
}
template <typename T>
template <typename Compare>
void Heap<T>::downElement(int i,Compare comp)
{
int down = i;
int min;
while((2*down+1) < m.size())
{
min = 2*down+1;
if((2*down+2) < m.size())
{
if(comp(m[2*down+2],m[min]))
min = 2*down+2;
}
if(comp(m[down],m[min]))
{
break;
}
else
{
swap(m[min],m[down]);
down = min;
}
}
}
int main()
{
vector<int> a;
for(int i = 10;i < 20;i++)
{
a.push_back(i);
}
random_shuffle(a.begin(),a.end());
Heap<int> heap(a);
heap.sort(less<int>());
heap.sort(greater<int>());
return 0;
}
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- powerdesigner12.5 设置表字符集和存储引擎
- 临时看看
- 对 malloc free ,new,delete 的思考与探索——2
- Swift教程(二)
- C语言程序的构成
- 堆排序
- 初接触JZ2440,遇到的问题及解决
- 自定义客户端消费LS的ODATA示例二 解决重复验证
- MFC消息映射详解(整理转载)
- Monkeyrunner点击方法
- Struts2学习笔记(二)数据驱动与struts.xml配置
- linux新建用户与权限修改
- QT541安装与配置
- Snail—UI学习之滚动视图UIScrollViewControl