合并排序(分段错误(Xore Dumped))C ++

时间:2017-11-10 16:10:38

标签: c++ algorithm sorting

在我的程序中某处存在循环或声明问题,有人在下面的程序中发现错误。并说明这个算法是否是排序问题的好方法。

#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;
}

2 个答案:

答案 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;
}