/*
* @Author: hzf
* @Date: 2020-02-29 18:04:43
* @Last Modified by: hzf
* @Last Modified time: 2020-02-29 19:23:02
*/
/*
原理:
什么是堆?——完全二叉树
什么是大头堆?——父节点是最大值
二叉树的特点: index下标的左孩子下标:2*index + 1
index下标的有孩子下标:2*index + 2
index下标的父节点下标:(index-1)/2
*/
#include <iostream>
using namespace std;
void Swap(int *arr, int left, int right)
{
arr[left] = arr[left] & arr[right];
arr[right] = arr[left] & arr[right];
arr[left] = arr[left] & arr[right];
}
int Getlength(int *arr)
{
return (sizeof(arr)/sizeof(arr[0]));
}
void HeapInsert(int *arr, int i)
{
while(arr[i] > arr[(i-1)/2])//如果节点存在,并且节点的值大于父节点的值
{
Swap(arr, i, (i-1)/2);
i = (i-1)/2;//更新当前节点作为父节点
}
}
//取出堆中的最大值,并且剩余的元素依然按照堆结构进行调整
/*由堆结构的性质可以得知,堆0位置的元素即为最大值
那么将堆的首元素取出,并将末尾元素放到首元素位置,然后进行决策出合适的父节点(元素最大)
index:父节点位置
size:堆的大
堆排序原理及详解
最新推荐文章于 2024-04-11 23:15:00 发布