如何解决为什么此堆排序代码对于某些输入数组失败
有人可以告诉我这段代码有什么问题吗?我已经花了将近1天的时间来找出问题所在。该堆排序代码因某些输入而失败。
即对于输入数组arr = {1,5,2,4,3,6,7,9,8}。 此代码应打印 {9,8,1,0},但是此代码给出了{5,0}
#include<iostream>
using namespace std;
void printarr(int *arr,int n)
{
for(int i=0;i<=n;i++)
cout<<arr[i]<<" ";
cout<<endl;
}
void heapify(int *arr,int i,int n)
{
int max=i;
if(arr[max]<arr[(2*i)+1] && (2*i)+1<=n)
max=(2*i)+1;
if(arr[max]<arr[(2*i)+2] && (2*i)+2<=n)
max=(2*i)+2;
if(i!=max)
{
swap(arr[max],arr[i]);
heapify(arr,max,n);
}
}
void buildheap(int *arr,int j)
{
for(;i<=(i+j)/2;i++)
heapify(arr,i,j);
}
int* heapsort(int *arr,int n)
{
buildheap(arr,n-1);
int *b,index=0;
b=new int[n];
while(n>=i)
{
b[index++]=arr[i];
arr[i]=arr[n--];
heapify(arr,n);
}
return b;
}
int main()
{
int *arr,n;
cout<<"how many elements?"<<endl;
cin>>n;
cout<<"enter elements : "<<endl;
arr=new int [n];
for(int i=0;i<n;i++)
cin>>arr[i];
arr=heapsort(arr,n-1);
printarr(arr,n-1);
}
解决方法
我发现2个错误
- 您应该首先检查超出范围的条件,然后进行比较。
- 更改
if(arr[max]<arr[(2*i)+1] && (2*i)+1<=n) max=(2*i)+1;
- 致
if((2*i)+1<=n && arr[max]<arr[(2*i)+1])
- 更改
- 如果要构建堆,则可以像这样运行循环。因为你在heapify中写过什么
- 更改
void buildheap(int *arr,int i,int j) { for(;i<=(i+j)/2;i++) heapify(arr,i,j); }
- 致
void buildheap(int *arr,int j) { for(i = j/2; i >= 0;i--) heapify(arr,j);}
- 更改
#include<iostream>
using namespace std;
void printarr(int *arr,int n)
{
for(int i=0;i<=n;i++)
cout<<arr[i]<<" ";
cout<<endl;
}
void heapify(int *arr,int n)
{
int max=i;
max=(2*i)+1;
if((2*i)+2<=n && arr[max]<arr[(2*i)+2])
max=(2*i)+2;
if(i!=max)
{
swap(arr[max],arr[i]);
heapify(arr,max,n);
}
}
void buildheap(int *arr,int j)
{
for(i = j/2; i >= 0;i--)
heapify(arr,j);
}
int* heapsort(int *arr,int n)
{
buildheap(arr,n-1);
int *b,index=0;
b=new int[n];
while(n>=i)
{
b[index++]=arr[i];
arr[i]=arr[n--];
heapify(arr,n);
}
return b;
}
int main()
{
int *arr,n;
cout<<"how many elements?"<<endl;
cin>>n;
cout<<"enter elements : "<<endl;
arr=new int [n];
for(int i=0;i<n;i++)
cin>>arr[i];
arr=heapsort(arr,n-1);
printarr(arr,n-1);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。