[https://www.bilibili.com/video/BV1kt4y1U7rz](https://)
#堆排序
```
#include<iostream>
using namespace std;
//堆排序
//1.建大顶堆
void adjustHeap(int a[], int i, int len)//调整以i为根的二叉树满足大顶堆的性质
{
for (i = 2 * i; i <= len; i = 2 * i)
{
//如果右孩子大,就让i指向右孩子
if (i<len && a[i + 1]>a[i]) i++;
//如果子节点大于父节点则交换
if (a[i] > a[i / 2]) swap(a[i], a[i / 2]);
else break;
}
}
//在建立大顶堆的代码中,交换函数可进行优化变更为赋值
void adjustHeap(int a[], int i, int len)//调整以i为根的二叉树满足大顶堆的性质
{
int temp = a[i];//保存当前节点值
for (i = 2 * i; i <= len; i = 2 * i)
{
//如果右孩子大,就让i指向右孩子
if (i<len && a[i + 1]>a[i]) i++;
//如果子节点大于temp,让子节点上浮
if (a[i] > temp) a[i / 2] = a[i];
else break;
}
a[i / 2] = temp;//temp放到最终位置
}
//调用:
//for (i = n / 2; i >= 1; i--) adjustHeap(a, i, n);
//2.堆排序
/*
for(i=n;i>=2;i--)
{
swap(a[1],a[i]);
adjustHeap(a, 1, i-1);
}
*/
#include<iostream>
using namespace std;
void adjustHeap(int a[], int i, int len)//调整以i为根的二叉树满足大顶堆的性质
{
int temp = a[i];//保存当前节点值
for (i = 2 * i; i <= len; i = 2 * i)
{
//如果右孩子大,就让i指向右孩子
if (i<len && a[i + 1]>a[i]) i++;
//如果子节点大于temp,让子节点上浮
if (a[i] > temp) a[i / 2] = a[i];//赋值代替交换
else break;
}
a[i / 2] = temp;//temp放到最终位置
}
int main()
{
int i, n = 6;
int a[101] = { 0,2,5,6,9,7,8 };
//建立大顶堆 必须从下到上调整
//【n/2】是最后一个分支节点
for (i = n / 2; i >= 1; i--) adjustHeap(a, i, n);
//堆排序
for (i = n; i >= 2; i--)
{
swap(a[1], a[i]);
adjustHeap(a, 1, i - 1);
}
//输出
for (i = 1; i <= n; i++) cout << a[i] << " ";
return 0;
}
```