1.堆排序:堆排序是按照堆的数据结构来进行排序 并且这种数据结构称为完全二叉树。
大顶堆:父节点值大于孩子节点 升序排列用大顶堆
小顶堆:父节点值小于孩子节点 降序排列用小顶堆
2.堆排序原则:
将数组先臆想成二叉树,然后调整为大顶堆,接着向根节点的值和尾结点进行交换,交换完毕将当前根节点排除我们整个排序过程,直到二叉树只剩下一个节点,具体原则流程见下图:
3.堆排序代码实现
补充:推子节点和父节点关系 如果父节点下标是i 则子节点下标是2i+1
子节点下标是i 父节点下标是(i-1)/2
void Heap_Adjust(int* arr, int len, int start, int end)
{
//将start这个下标的值 拷贝到tmp
int tmp = arr[start]; //难点4:i=start*2+1
for (int i = start * 2 + 1; i <= end; i = start * 2 + 1)//i代表左孩子的下标
{
if (i + 1 <= end && arr[i + 1] > arr[i]) //i+1代表右孩子下标
{ //如果左右孩子都存在,且右孩子的值大于左孩子,则让i指向右孩子
i++;
}
//此时i肯定指向较大的