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);
}
}