堆排序算法
#include<iostream>
using namespace std;
//获取父节点
int Parent(int i)
{
return i/2;
}
//获取左孩子
int Left(int i)
{
return 2*i;
}
//获取右孩子
int Right(int i)
{
return 2*i+1;
}
//从i节点开始构造最大堆
void MaxHeap(int *a,int i,int length)
{
int L,R;
L=Left(i);
R=Right(i);
int largest;
if(L <= length && a[L-1] > a[i-1])
{
largest=L;
}
else
{
largest=i;
}
if(R <= length && a[R-1] > a[largest-1])
{
largest=R;
}
//比较i节点和它子节点 如果需要调整 则先进行调整 然后再递归构造该节点
if(largest != i)
{
int temp;
temp=a[i-1];
a[i-1]=a[largest-1];
a[largest-1]=temp;
MaxHeap(a,largest,length);
}
}
//堆排序
void HeapSort(int *a,int length)
{
////将整个树生成最大堆 从最后一个非叶子节点开始构造
for(int i=length/2;i>=1;i--)
{
MaxHeap(a,i,length);
}
//不断将大根堆根节点放在length下标对应的位置 然后构建length-1大根堆
for(int i=length;i>0;i--)
{
int temp;
temp=a[i-1];
a[i-1]=a[0];
a[0]=temp;
length-=1;
MaxHeap(a,1,length);
}
}
int main()
{
int a[10]={4,1,3,2,16,9,10,14,8,7};
HeapSort(a,10);
for(int i=0;i<10;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
本博客内容均来自网络,如有雷同,是我抄袭!
浙公网安备 33010602011771号