堆排序是一种不稳定的排序算法
数据结构书中对于算法的介绍不够详尽,导致我对冒泡和快排之外的算法不够熟悉
这篇文章首先会引用爱奇艺的算法视频,在短短12分钟内对此算法有完整的认识
下面的C++代码很详细的注释了堆排序的关键步骤
#include <iostream>
#include <algorithm>
using namespace std;
void HeapAdjust(int *a,int i,int size)
{
int lchild = 2 * i;
int rchild = 2 * i + 1; //根据规则找到子节点位置
int max = i;
if (i <= size / 2)
{
if (lchild <= size && a[lchild] > a[max])
{
max = lchild;
}
if (rchild <= size && a[rchild] > a[max])
{
max = rchild;
}
if (max != i)
{
swap(a[i], a[max]); //如果子节点值大于根节点,将较大的子节点与根节点交换
HeapAdjust(a, max, size); //递归调用,保证调整后的子树也满足堆序
}
}
}
void BuildHeap(int *a,int size)
{
for (int i = size/2; i >= 1; i--)
{
HeapAdjust(a,i,size); //i = size/2 从非叶子节点的最大节点开始遍历调整
}
}
void HeapSort(int *a,int size)
{
BuildHeap(a,size); //因为完全二叉树的规律,可以用数组来存储
for (int i =size; i >= 1; i--)
{
swap(a[1],a[i]); //将二叉树最后一个元素与堆顶元素交换
HeapAdjust(a,1,i-1); //调用堆调整函数,i-1把刚刚交换来的堆顶元素排除
}
}