堆
- 堆:近似二叉树
例:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5919fb545cc55e5ea9d8cc0610bc168e.png)
- 最大堆:任意一个结点的值不超过其父结点。
最小堆:任意一个结点的值不小于其父结点。 - 结点的高度:该结点到叶结点最长简单路的边数。
堆排序算法
c/c++源码
#include<iostream>
using namespace std;
int heap_size;
void exchange(int&,int&);
void max_heap(int *x,int i)
{
int l=2*i+1;
int r=2*i+2;
int largest=i;
if(l<=heap_size&&x[l]>x[largest])
largest=l;
if(r<=heap_size&&x[r]>x[largest])
largest=r;
if(largest!=i)
{
exchange(x[i],x[largest]);
max_heap(x,largest);
}
}
void build_max_heap(int *x,int n)
{
for(int i=(n-1)/2;i>=0;i--)
max_heap(x,i);
}
void heap_up_sort(int *x,int n)
{
build_max_heap(x,n-1);
for(int i=n-1;i>=1;i--)
{
exchange(x[i],x[0]);
heap_size--;
max_heap(x,0);
}
}
void exchange(int &a,int&b)
{
int c=a;
a=b;
b=c;
}
int main()
{
int i,n,*x;
cout<<"请输入数组元素个数:";
cin>>n;
x=new int[n];
cout<<"请依次输入数组元素:"<<endl;
for(i=0;i<n;i++)
cin>>x[i];
heap_size=n-1;
heap_up_sort(x,n);
cout<<"排序后数组为:"<<endl;
for(i=0;i<n;i++)
cout<<x[i]<<" ";
return 0;
}