其实建堆和堆排序十分的简单,就是不断的向下调整的过程
建堆是从floor(2/i)处开始,一直到根节点,依次不断的向下调整
堆排序是从最后一个节点不断的与第一个根节点交换,然后再让第一
个节点不断的向下的调整
#include<bits/stdc++.h>
using namespace std;
int a[15]={-1000,1,5,6,3,9,5,4,2,7,7};
int n=10;//表示数组的长度
void adjust_down(int i,int len)
{
int left=2*i;
int right=2*i+1;
int m=i;//记录最大值
if(left<=len&&a[m]<a[left])
{
m=left;
}
if(right<=len&&a[m]<a[right])
{
m=right;
}
if(m!=i)//如果左右孩子都不满足,就不需要继续向下跟新了
{
swap(a[m],a[i]);
adjust_down(m,len);
}
}
void build_heap()
{
for(int i=n/2;i>=1;i--)
{
adjust_down(i,n);
}
}
void heap_sort()
{
for(int i=n;i>=2;i--)//调整n-1次就行了
{
swap(a[i],a[1]);
adjust_down(1,i-1);
}
}
int main()
{
build_heap();
heap_sort();
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
}
来源:CSDN
作者:溺水的鱼。。。
链接:https://blog.csdn.net/weixin_43310882/article/details/104179896