堆排序
以最大堆为例
思想(关键点)
- 最大堆中的最大元素值出现在根结点(堆顶)
- 堆中每个父节点的元素值都大于等于其孩子结点
- 建堆:从最下面的父亲节点开始建堆,直至根节点
- 新来一个节点:将其放在叶子节点,并且按照它这边父亲节点一路向上判断交换
- 堆排序过程:把最大堆堆顶的最大数取出,将剩余的堆继续调整为最大堆,再次将堆顶的最大数取出,这个过程持续到剩余数只有一个结束
代码
建堆
void heapify(int *arr,int n, int k)
{
int largest = k;
int l = 2*k + 1;
int r = 2*k + 2;
if(l < n && arr[l] > arr