#include<iostream>
using namespace std;
void adjustdown(int a[],int i,int len)
{
a[0]=a[i]; //此时a[0]存储的是要调整的非叶节点的值
for(int j=2*i;j<=len;j*=2)
{
if(j<len && a[j]>a[j+1])
j++;
if(a[0]<a[j]) break; //如果子节点的值均小于要调整的i节点的值,则不调整,退出此次循环
else
{
a[i]=a[j]; //否则,讲子节点中值较小的那个的值赋给其父节点,
i=j; //调整完的子节点成为新的父节点,继续向下调整
}
}
a[i]=a[0]; //将最开始的父节点的值赋给找到的位置,此时a[i]未必是原a[i]的直接孩子,可能是孙子重孙。。。
}
void buildminheap(int a[],int len)
{
for(int i=len/2;i>0;i--) //i代表要调整的父节点,j为i的子节点
adjustdown(a,i,len);
}
void Heapsort(int a[],int len)
{
buildminheap(a,len); //建堆,注意,建好的堆并不有序,仅能确保堆顶是最小元素
for(int i=len;i>1;i--)
{
swap(a[i],a[1]); //每次都将堆顶与最后一个元素交换,然后调整使其重新成为小根堆
adjustdown(a,1,i-1);
} //由于每次输出最小值,故最终数组有序
}
int main()
{
int a[11]={0,5,7,2,8,1,6,9,11,4,20};
Heapsort(a,10);
for(int i=1;i<=10;i++)
cout<<a[i]<<' ';
cout<<endl;
system("pause");
return 0;
}
07-11
07-11
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交