昨天后来做堆排序算法时候卡住了,今天解决了半天,最后发现居然是一个<=还是<的问题。这样的错误已经至少两次了,为啥就是不能避免呢。
利用昨天做的heapify函数,实现堆排序。原则就是每次形成一个大根堆,然后把最大的扔到最后去,再对前面剩下的那些排序,生成大根堆,每次这样,直到最后大根堆中只有一个元素。
#include<iostream>
using namespace std;
int N(11);
void heapify(int a[],int i)
{
int l,r,largest,temp;
l=2*i;
r=2*i+1;
//find the largest one in i,l,r.
if (l<N && a[l]>a[i])
largest=l;
else largest=i;
if(r<N && a[r]>a[largest])
largest=r;
//cout<<"largest="<<largest<<endl;
//if i is not the largest one,exchange.
if(largest!=i)
{temp=a[i];
a[i]=a[largest];
a[largest]=temp;
cout<<"largest="<<largest<<" "<<a[largest]<<endl;
//use largest to do the next check.
heapify(a,largest);
}
//else heapify(a,l);
}
int main()
{
int a[]={0,4,1,3,2,16,9,10,14,8,7};
for(int i=N;i>0;i--)
{
heapify(a,i);
}
for(int j=1;j<N;j++)
{
cout<<a[j]<<" ";
}
cout<<endl;
for(int t=N-1;t>=1;t--)
{
N--;
int tt;
tt=a[t];
a[t]=a[1];
a[1]=tt;
cout<<"N="<<N<<" ";
cout<<"a["<<t<<"]="<<a[t]<<" a[1]="<<a[1]<<endl;
heapify(a,1);
for(int j=1;j<11;j++)
{
cout<<a[j]<<" ";
}
cout<<endl;
}
}