读书人

算法导论第六章堆排序的实现求高手

发布时间: 2012-05-24 11:55:41 作者: rapoo

算法导论第六章,堆排序的实现,求高手帮我看看哪错了。
[code=C/C++][/code]
#include <iostream>
using namespace std;

int larget;
int index;
int heap_size;

int PARENT(int i )
{
return i/2;
}

int LEFT(int i)
{
return 2 * i;
}

int RIGHT(int i)
{
return (2*i+1);
}

void MAX_HEAPIFY(int *a,int i)
{
index = i;
int l = LEFT(index);
int r = RIGHT(index);

if (l <= heap_size && a[l]>a[index])
{
larget = l;
}
else
larget = index;

if (r <= heap_size && a[r] > a[larget])
{
larget = r;
}

if (larget != index)
{
int temp = a[index];
a[index] = a[larget];
a[larget] = a[temp];

MAX_HEAPIFY(a,larget);
}
}

void BUILD_MAX_HEAPIFY(int *a,int n)
{ int i;
heap_size = n;
for (i = n/2;i > 0;i--)
{
MAX_HEAPIFY(a,i);
}
}

void HEAP_SORT(int *a,int n)
{
BUILD_MAX_HEAPIFY(a,n);
/*for (int i = 1;i <= n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;*/

for (int i = n;i >= 2;i--)
{
int temp = a[1];
a[1] = a[i];
a[i] = temp;
heap_size = heap_size-1;
MAX_HEAPIFY(a,1);
}
}

int main()
{
int T;
cin>>T;
while (T--)
{
int n;
cin>>n;
int a[101];
for (int i = 1;i <= n;i++)
{
cin>>a[i];
}
HEAP_SORT(a,n);
for (int i = 1;i <= n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
return 0;
}

应该是MAX_HEAPIFY那错了,但我检查了半天,真心不知道怎么改。求高手帮我看看

[解决办法]
贴一个我的吧,lz可以对着找找bug

C/C++ code
#include<iostream>using namespace std;void HeapAjust(int r[],int s,int t){     int j;     r[0]=r[s];     for(j=2*s;j<=t;j=2*j){//沿关键码较大的孩子结点向下筛选         if(j<t && r[j]<r[j+1])             j++;    //j指向R[i]的关键码较大的孩子         if(r[0]>r[j])  //不用调到叶子就到位了             break;         r[s]=r[j];         s=j;//准备向下调整     }     r[s]=r[0];  //插入}void HeapSort(int r[],int n){     int i;     for(i=n/2;i>0;i--)         HeapAjust(r,i,n); //将R[1]……R[n]建成堆     for(i=n;i>1;i--){         r[0]=r[1];         r[1]=r[i];         r[i]=r[0];         HeapAjust(r,1,i-1); //将R[1]……R[i-1]重新调整为堆     }}int main(){    int r[11]={0,3,6,2,3,6,1,9,11,42};    HeapSort(r,10);//r[0]不作为排序对象    for(int i=1;i<=10;i++)       cout<<r[i]<<" ";    cout<<endl;     system("pause");    return 0; } 

读书人网 >软件架构设计

热点推荐