合并排序分段故障

时间:2014-07-27 15:24:45

标签: c mergesort

我在C中为Merge Sort编写了一个程序,但是我遇到了Segmentation Fault,我不知道为什么?你能给我一个暗示可能出错的东西吗?

代码:

#include <stdio.h>
#include <math.h>

  void Merge(int A[],int p,int q,int r){
       int n1,n2,i,j,k;
       n1=q-p+1;
       n2=r-q;
       int L[n1],R[n2];
       for (i=0; i<n1; i++) L[i]=A[p+i-1];
       for (j=0; j<n2; j++) R[j]=A[q+j];
       i=0;
       j=0;
       for (k=p; k<r; k++){
          if (L[i]<=R[j]){
              A[k]=L[i];
              i=i+1;
          }
          else{
          A[k]=R[j];
          j=j+1;
          }
          }
  }

  void Sort(int A[],int p,int r){
      int q;
       if (p<r){
          q=floor((p+r)/2);
          Sort(A,p,q);
          Sort(A,q+1,r);
          Merge(A,p,q,r);
        }
        }  
 int main()
 {
    int n,i,p,r;
    printf("Give a value for n: \n");
    scanf("%d",&n);
    int A[n];
    for (i=0; i<n; i++){
        printf ("Give %d th value of the array: \n",i+1 );
        scanf("%d",&A[i]);
    }
    printf("Give me a value for p:\n");
    scanf("%d",&p);
    printf("Give me a value for r:\n");
    scanf("%d",&r);
    Sort(A,p,r);
    printf("p=%d, r=%d \n \n", p,r);
    for (i=0; i<n; i++) printf("%d", A[i]);
    return 0;
 }

这就是我得到的,在终端提供输入:

Give a value for n:
8
Give 1 th value of the array:
1
Give 2 th value of the array:
6
Give 3 th value of the array:
5
Give 4 th value of the array:
3
Give 5 th value of the array:
5
Give 6 th value of the array:
4
Give 7 th value of the array:
2
Give 8 th value of the array:
7
Give me a value for p:
2
Give me a value for r:
6
Segmentation fault (core dumped)

在Sort函数中我做错了吗?

3 个答案:

答案 0 :(得分:3)

可能的罪魁祸首是这两行:

int n1,n2,i,j,k;
int L[n1],R[n2];

首先,您声明n1n2,但不要初始化它们。这意味着它们的值是 indeterminate ,并且在初始化它们之前不应该使用这些变量。

但是,在下一行中你仍然使用它们,这会导致undefined behavior,这意味着你的整个程序都是格式错误的,不能依赖它来正常工作。

答案 1 :(得分:2)

在您实例化变量n1n2之前,函数Merge中的L[]R[]变量未定义。

试试这个:

int n1, n2, i, j, k;

n1 = q - p + 1;
n2 = r - q;

// Now you can instantiate your arrays
int L[n1], R[n2];

答案 2 :(得分:0)

#include<stdio.h>

void mergesort(int a[],int beg,int end)
{
    int mid;
    if(beg<end)
        mid = (beg+end)/2;
        mergesort(a,beg,mid);
        mergesort(a,mid+1,end);
        merge(a,beg,mid,end);
}

void merge(int a[],int beg,int mid,int end)
{
    int i=beg,j=mid+1,index=beg,temp[100],k;
    while((i<=mid) && (j<=end))
    {
        if(a[i]<a[j])
        {
            temp[index]=a[i];
            i=i+1;
        }
        else
        {
            temp[index]=a[j];
            j++;
        }
        index++;
    }
    if(i>mid)
    {
        while(j<=end)
        {
            temp[index]=a[j];
            j++;
            index++;
        }
    }
    else
    {
        while(i<=mid)
        {
            temp[index]=a[i];
            i++;
            index++;
        }
    }
    for(k=beg;k<index;k++)
    {
        a[k]=temp[k];
    }
}

int main()
{
    int a[100],n,i,j;
    printf("enter size of array");
    scanf("%d",&n);
    printf("enter elements");
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    mergesort(a,0,n-1);
    for(i=0;i<n;i++)
    {
        printf("5d",a[i]);
    }
    return 0;
}