【C++】CLRS上的堆排序实现
2014-10-07 11:43
176 查看
N天前照着书上伪代码写的堆排序,今天改成了非递归的,自己码出来还是挺涨姿势的……
#include <iostream> #include <vector> #include <cstdlib> typedef std::vector<int> VecInt; //功能:交换两个整型变量 void Swap(int& a, int& b) { int temp = a; a = b; b = temp; } //功能:建大根堆,非递归 void Max_Heapify(VecInt& arr, int i, int heapsize) { while (true) { //左右子节点和最大节点下标 int left = 2 * i; int right = 2 * i + 1; int largest = 0; //最大节点下标设为largest if (left <= heapsize && *(arr.begin() + left) > *(arr.begin() + i)) largest = left; else largest = i; if (right <= heapsize && *(arr.begin() + right) > *(arr.begin() + largest)) largest = right; //最大节点移到子树根上,在该节点原处进行递归 if (largest != i) { Swap(*(arr.begin() + largest), *(arr.begin() + i)); i = largest; } else break; } } //功能:堆排序,下标0的元素空出 void Heap_Sort(VecInt& arr, int length) { //初始化堆长 int heapsize = length; //从最后一个非叶节点开始向根节点,依次对每个子树整堆 for (int i = length / 2; i != 0; --i) Max_Heapify(arr, i, heapsize); //将根节点和最后一个节点变量交换,堆长减一,由根节点开始整堆 for (int i = length; i != 1; --i) { Swap(*(arr.begin() + 1), *(arr.begin() + i)); --heapsize; Max_Heapify(arr, 1, heapsize); } }
相关文章推荐
- 堆排序(C++模版技术实现)
- 排序法系列之六---堆排序(C++代码实现)
- c++堆排序实现(heapsort) (算法导论)
- C++实现的堆排序
- 排序算法的C++实现与性能分析(插入排序、归并排序、快速排序、STOOGE排序、堆排序)
- 选择排序——简单选择排序和堆排序,C++代码实现
- 几种排序算法的C++实现——快速排序、堆排序、基数排序
- 算法思路重新实现-堆排序 中的 C++ & Java
- 算法数据结构C++实现8 堆排序 难点分析
- c++手动和STL实现堆排序
- C++实现堆排序
- CLRS 堆排序实现和分析
- LinuxC/C++编程基础(6) 堆排序的实现
- 堆排序-c++实现,节点变动则递归子树调整状态
- 堆排序的实现 C++
- 堆、堆排序、优先级队列(c++实现)
- c++实现堆排序
- C++ 堆排序实现
- C++实现堆排序
- 算法设计之堆的实现与堆排序实现(C++实现)