泛型算法之堆排
2015-09-13 13:11
176 查看
实现了堆排的泛型算法,测试用例覆盖了STL的容器,C++内置数组,int,char,double类型元素。
#include <iostream> #include <vector> using namespace std; template<typename RandomAccessIterator> //下溯 void HeapAdjust(RandomAccessIterator begin, RandomAccessIterator end, RandomAccessIterator start) { int len = end - begin; end--; int s = 2 * (start - begin + 1); auto parent = *start; auto child = begin; for (; s<=len; s = 2*(start - begin + 1) ) { child = begin + s-1; if (child < end&&*child < *(child + 1)) ++child; if (parent >= *child) break; *start = *child; start = child; } *start = parent; } template<typename RandomAccessIterator> void HeapSort(RandomAccessIterator begin, RandomAccessIterator end) { int len = end - begin; int i; for (i = len / 2; i > 0; --i) //上溯 HeapAdjust(begin, end, begin+i-1); //构造大顶堆 for (i = len; i > 1; --i) { iter_swap(begin, begin + i - 1); HeapAdjust(begin, begin+i-1, begin); //构造大顶堆 } } int main(int argc, char ** argv) { vector<int> a = { 9, 4, 2, 7, 5, 6, 0, 1, 3, 10, 14, 8, 11, 15, 18, 19, 17, 16, 12, 13 }; double b[20] = { 0.0, 4.4, 2.2, 7.7, 5.5, 6.6, 9.9, 1.1, 3.3, 10, 14, 8, 11, 15, 18, 19, 17, 16, 12, 13 }; char c[20] = { 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm', 'q', 'w', 'e', 'r' }; HeapSort(a.begin(), a.end()); for (auto i = a.begin(); i != a.end(); ++i) cout << *i <<" "; cout << endl; HeapSort(b,b+20); for (auto i = 0; i <20; ++i) cout << b[i] << " "; cout << endl; HeapSort(c, c + 20); for (auto i = 0; i <20; ++i) cout << c[i] << " "; cout << endl; return 0; }
测试结果
相关文章推荐
- iOS知识点
- python下载地址到迅雷qq旋风下载
- Shell: nohup守护进程化
- Swift 学习网址精选 By HL
- Nginx Location配置总结
- BestCoder Round #50
- PAT1100. Mars Numbers (20)
- 5、Android网络编程
- bash shell数组
- C++_std::bind std::function 高级用法
- 《javascript高级编程》读书笔记(两)javascript基本概念
- 网易云音乐歌词下载器
- DEDE列表调用有缩图显示缩图,无缩图则不显示缩图的方法
- EditText不自动获得输入焦点(以及 获得焦点但不弹出输入法软键盘的方法)
- ConcurrentHashMap之实现细节
- 任意匹配
- oracle ocfs2 安装配置
- LintCode "A + B Problem"
- 虚拟机安装 centos7 注意事项
- UC/OS II事件管理之信号量管理实例