Ошибка сегментации для функции слияния сортировки слиянием - PullRequest
0 голосов
/ 26 декабря 2018

Моя задача - реализовать только функцию слияния алгоритма сортировки слиянием. Моя идея - создать вспомогательный массив для хранения отсортированных значений. Я установил 2 указателя, один для левого отсортированного массива и другой для правого отсортированного массива.

Мне трудно понять, почему я получаю ошибку сегментации?

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 23 4 5 6 7 8 9 10

Мой выход: ошибка сегментации

1 Ответ

0 голосов
/ 26 декабря 2018

Прежде всего, эти строки для 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 для ptr2 не работает, так как адрес после последнего элемента не NULL.

...