您的位置:首页 > 编程语言 > C语言/C++

【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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: