在我的程序中某处存在循环或声明问题,有人在下面的程序中发现错误。并说明这个算法是否是排序问题的好方法。
#include<iostream>
using namespace std;
void merge(int a[],int start,int mid,int end){
int p=start,q=mid+1;
int Arr[end-start+1],k=0;
for(int i=start;i<=end;i++){
if(p>mid)
Arr[k++]=a[q++];
else if(q>end)
Arr[k++]=a[p++];
else if(a[p]<a[q])
Arr[k++]=a[p++];
else
Arr[k++]=a[q++];
for(int i=0;i<k;i++)
a[start++]=Arr[i];
}
}
void merge_sort(int a[],int start,int end){
int mid;
if(start<end){
int mid= (start+end) /2;
}
merge_sort(a,start,mid);
merge_sort(a,mid+1,end);
merge(a,start,mid,end);
}
int main(){
int n;
cout<<"Enter the n:"<<endl;
cin>>n;
int a[n];
cout<<"Enter the values in the array:"<<endl;
for(int i=0;i<n;i++){
cin>>a[i];
}
int start=0,end=n-1;
merge_sort(a,start,end);
cout<<"After Sorting: "<<endl;
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
return 0;
}
答案 0 :(得分:0)
您的merge_sort
功能存在一些问题:
void merge_sort(int a[], int start, int end)
{
int mid;
if (start < end)
mid = (start+end) / 2; // Also, don't re-declare mid with int!
merge_sort(a, start, mid);
merge_sort(a, mid + 1, end);
merge(a, start, mid, end);
}
您无条件地在merge_sort
内拨打merge_sort
。即使你的程序没有崩溃,它也永远不会完成,并且可能会被你的系统杀死,因为它造成的混乱。
我建议您在尝试修复代码之前获得更舒适的递归函数。
答案 1 :(得分:0)
错误是括号的位移。
#include<iostream>
using namespace std;
void merge(int a[],int start,int mid,int end){
int p=start,q=mid+1;
int Arr[end-start+1],k=0;
for(int i=start;i<=end;i++){
if(p>mid)
Arr[k++]=a[q++];
else if(q>end)
Arr[k++]=a[p++];
else if(a[p]<a[q])
Arr[k++]=a[p++];
else
Arr[k++]=a[q++];
}
for(int i=0;i<k;i++)
{
a[start++]=Arr[i];
}
}
void merge_sort(int a[],int start,int end){
if(start<end){
int mid= (start+end) /2;
merge_sort(a,start,mid);
merge_sort(a,mid+1,end);
merge(a,start,mid,end);
}
}
int main(){
int n;
cout<<"Enter the n:"<<endl;
cin>>n;
int a[n];
cout<<"Enter the values in the array:"<<endl;
for(int i=0;i<n;i++){
cin>>a[i];
}
int start=0,end=n-1;
merge_sort(a,start,end);
cout<<"After Sorting: "<<endl;
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
return 0;
}