Recently I reviewed the classic heapsort algorithm and implement it according to contents in Introduction to Algorithms (3rd edition). The heap data structure is implemented as a template class and the heapsort algorithm is implemented as a public method of the template class. The code is as follows.

 #include <iostream>
#include <vector> using namespace std; template<typename T> class Heap {
public:
Heap(vector<T>&);
~Heap(void); inline int parent(int);
inline int left(int);
inline int right(int); void max_heapify(int);
void build_max_heap(void);
void heap_sort(void); /* Methods for maximum priority queue. */
T maximum(void);
T extract_max(void);
void increase_key(int, T);
void insert_key(T); void print(void);
private:
vector<T> data;
int heap_size;
}; template<typename T> Heap<T>::Heap(vector<T>& d) {
data = d;
build_max_heap();
} template<typename T> Heap<T>::~Heap(void) {
data.clear();
heap_size = ;
} template<typename T> inline int Heap<T>::parent(int idx) {
return (idx - ) >> ;
} template<typename T> inline int Heap<T>::left(int idx) {
return (idx << ) + ;
} template<typename T> inline int Heap<T>::right(int idx) {
return (idx << ) + ;
} template<typename T> void Heap<T>::max_heapify(int idx) {
int largest = idx;
int l = left(idx);
int r = right(idx);
if (l < heap_size && data[l] > data[largest]) largest = l;
if (r < heap_size && data[r] > data[largest]) largest = r;
if (largest != idx) {
swap(data[idx], data[largest]);
max_heapify(largest);
}
} template<typename T> void Heap<T>::build_max_heap(void) {
heap_size = data.size();
for (int i = (heap_size >> 1) - ; i >= ; i--)
max_heapify(i);
} template<typename T> void Heap<T>::heap_sort(void) {
int size = heap_size - ;
for (int i = size; i > ; i--) {
swap(data[i], data[]);
heap_size--;
max_heapify();
}
} template<typename T> T Heap<T>::maximum(void) {
return data[];
} template<typename T> T Heap<T>::extract_max(void) {
if (data.empty()) throw runtime_error("Heap underflow!");
int maximum = data[];
swap(data[], data[heap_size - ]);
heap_size--;
max_heapify();
return maximum;
} template<typename T> void Heap<T>::increase_key(int idx, T key) {
if (key < data[idx]) {
cerr << "New key is smaller!" << endl;
return;
}
data[idx] = key;
while (idx >= 0 && parent(idx) >= 0 && data[parent(idx)] < data[idx]) {
swap(data[idx], data[parent(idx)]);
idx = parent(idx);
}
} template<typename T> void Heap<T>::insert_key(T key) {
data.insert(data.begin() + heap_size, key - );
heap_size++;
increase_key(heap_size - , key);
} template<typename T> void Heap<T>::print(void) {
printf("In heap: ");
for (int i = ; i < heap_size; i++)
printf("%d ", data[i]);
printf(", ");
if (heap_size < (int)data.size()) {
printf("Out of heap: ");
for (int i = heap_size; i < (int)data.size(); i++)
printf("%d ", data[i]);
}
printf("\n");
} void heap_test(void) {
int num[] = {, , , , , , , , , };
vector<int> nums(num, num + sizeof(num) / sizeof(int));
// Construct a heap and print it
Heap<int> heap(nums);
heap.print();
// Test maximum() and extract_max()
printf("%d\n", heap.maximum());
printf("%d\n", heap.extract_max());
heap.print();
// Test increase_key()
heap.increase_key(, );
heap.print();
// Test insert_key()
heap.insert_key();
heap.print();
// Test heap_sort()
heap.heap_sort();
heap.print();
} int main(void) {
heap_test();
system("pause");
return ;
}

If you run this code, the expected output is  like (I am testing it in Microsoft Visual Studio Professional 2012):

In heap:           ,

In heap:          , Out of heap:
In heap: , Out of heap:
In heap: , Out of heap:
In heap: , Out of heap:

Welcome for any question, comment and suggestion about the code!

[Algorithms] Heap and Heapsort的更多相关文章

  1. Heap Sorting 总结 (C++)

    各位读者,大家好. 因为算法和数据结构相关的知识都是在国外学的,所以有些词汇翻译的可能不准确,然后一些源代码的注释可能是英文的,如有给大家带来什么不方便,请见谅.今天我想写一下Heap相关的知识,从基 ...

  2. 排序算法(5)--Selection Sorting--选择排序[2]--Heap Sort--堆排序

    1.基本思想 具有n个元素的序列 (h1,h2,...,hn),当且仅当满足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1) (i=1,2,...,n ...

  3. 算法 Heap sort

    // ------------------------------------------------------------------------------------------------- ...

  4. David MacKay:用信息论解释 '快速排序'、'堆排序' 本质与差异

    这篇文章是David MacKay利用信息论,来对快排.堆排的本质差异导致的性能差异进行的比较. 信息论是非常强大的,它并不只是一个用来分析理论最优决策的工具. 从信息论的角度来分析算法效率是一件很有 ...

  5. [151225] Python3 实现最大堆、堆排序,解决TopK问题

    参考资料: 1.算法导论,第6章,堆排序 堆排序学习笔记及堆排序算法的python实现 - 51CTO博客 堆排序 Heap Sort - cnblogs 小根堆实现优先队列:Python实现 -cn ...

  6. C语言排序

    排序算法 快速排序 C语言快速排序qsort(数组,长度,元素大小,cmp函数(*,*))//注意函数cmp的参数为指针 #include <stdio.h> #include <s ...

  7. Java与算法之(8) - 堆排序

    堆是一种特殊的完全二叉树,其特点是所有父节点都比子节点要小,或者所有父节点都比字节点要大.前一种称为最小堆,后一种称为最大堆. 比如下面这两个: 那么这个特性有什么作用?既然题目是堆排序,那么肯定能用 ...

  8. 洛谷 P1177 【模板】快速排序【13种排序模版】

    P1177 [模板]快速排序 题目描述 利用快速排序算法将读入的N个数从小到大排序后输出. 快速排序是信息学竞赛的必备算法之一.对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成.( ...

  9. 排序算法(Java实现)

    这几天一直在看严蔚敏老师的那本<数据结构>那本书.之前第一次学懵懵逼逼,当再次看的时候,发觉写的是非常详细,非常的好. 那就把相关的排序算法用我熟悉的Java语言记录下来了.以下排序算法是 ...

随机推荐

  1. unity3d之NGUI学习流水账

    博主是跟着视频教程学的,所以最新版的u3d是否已经自带这个功能博主没有考究过. 但是视频是2015下半年的教程,当时的u3d还是需要自行导入NGUI包的. 1.首先需要下载NGUI包.点此进入ngui ...

  2. DataTable转换成匿名类的List类型

    DataTable转换成匿名类的List类型   因为匿名类是不能够 Activator.CreateInstance进行反射实例化的 /// <summary> /// 匿名类的转换方式 ...

  3. elasticsearch mapping问题解决

    1.报错信息如下: [--16T00::,][WARN ][logstash.outputs.elasticsearch] Could not index event to Elasticsearch ...

  4. 5V转3.3v电路

    方案一: MIC5205-3.3 输出电流150ma 输出电压3.3V 其中:CT24为钽电容: 方案二: AMS1117-3.3 输出电流800ma 输出电压:3.3V 输入电压:4.75~12v

  5. css 禁用移动端部分特性

    禁止复制黏贴功能 .oncopy{ -webkit-user-select: none; } 禁止点击之后修改背景颜色 -webkit-tap-highlight-color: rgba(0,0,0, ...

  6. oracle 12c grid db 安装的的checklist

    oracle 12c 安装 checklist 关闭 iptables NetworkManager selinux service iptables stop chkconfig iptables ...

  7. Windows自带的端口转发工具netsh使用方法

    微软Windows的netsh是一个命令行脚本实用工具.使用netsh工具 ,可以查看或更改本地计算机或远程计算机的网络配置.不仅可以在本地计算机上运行这些命令,而且可以在网络上的远程计算机上运行. ...

  8. 如何将自己的网站分享到QQ空间,微信,微博等等。

    逛一些网站的时候经常会看到右侧挂个分享栏,让用户把自己的站分享到qq空间,微信等等,所以自己也研究了下,把他加到了自己的网站上,喜欢的可以先看看效果:去转盘网,不多说了,直接上代码: window._ ...

  9. 【Mac + Git】之git status中文文件名编码问题解决

    一.现象: 命令行输入:git status时,显示中文名乱码问题 二.解决办法: 命令行输入: git config --global core.quotepath false 通过将git配置变量 ...

  10. Lua一般都用来干什么,有什么优点

    Lua一般用于嵌入式应用,现在越来越多应用于游戏当中,魔兽世界,愤怒的小鸟都有用到. Lua极易嵌入到其他程序,可当做一种配置语言. 还有很多需要性能的地方,比如:游戏脚本,nginx,wiresha ...