合并排序的合并功能的分段错误

时间:2018-12-26 13:14:09

标签: c++11 mergesort

我的任务是仅实现合并排序算法的合并功能。我的想法是创建一个辅助数组来存储排序后的值。我维护了2个指针,一个指针用于左排序数组,另一个用于右排序数组。 / p>

我很难弄清楚为什么我会遇到细分错误?

void merge(int arr[], int l, int m, int r)
{

 int temp[r-l+1];int count=0;
 int *ptr1=(int*) malloc(sizeof(int));
 int * ptr2=(int*) malloc(sizeof(int));
 ptr1=&arr[l];
 ptr2=&arr[m+1];
 while(ptr1!=(&arr[m+1]) && ptr2!=NULL)
 {
     if(*ptr1>=*ptr2)
     {
      temp[++count]=*ptr2;
      ptr2++;
     }
     else 
     {
         temp[++count]=*ptr1;
         ptr1++;
     }
 }
 if(ptr1==&arr[m+1])
 {
     while(ptr2)
     {
        temp[++count]=*ptr2;
        ptr2++;
     }
 }
 if(ptr2==NULL)
 {
  while(ptr1!=&arr[m+1])
     {
        temp[++count]=*ptr1;
        ptr1++;
     }   
 }
 for(int i=0;i<r-l+1;i++)
 {
     arr[i]=temp[i];
 }
}

输入: 2

5

4 1 3 9 7

10

10 9 8 7 6 5 4 3 2 1

预期输出:

1 3 4 7 9

1 2 3 4 5 6 7 8 9 10

我的输出:细分错误

1 个答案:

答案 0 :(得分:0)

首先,这些行不需要malloc

 int *ptr1=(int*) malloc(sizeof(int));
 int * ptr2=(int*) malloc(sizeof(int));
 ptr1=&arr[l];
 ptr2=&arr[m+1];

并且可以更改为

 int *ptr1=&arr[l];
 int * ptr2=&arr[m+1];

另一个问题是对NULL的{​​{1}}的测试不起作用,因为最后一个元素后面的地址不是ptr2

相关问题