14.堆排序

堆排序是一种不稳定的排序算法

数据结构书中对于算法的介绍不够详尽,导致我对冒泡和快排之外的算法不够熟悉

这篇文章首先会引用爱奇艺的算法视频,在短短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把刚刚交换来的堆顶元素排除
	}
}

点赞