Сбой программы сортировки слиянием с «Завершен с кодом: 3221225477»

#c

#c

Вопрос:

Я пытаюсь написать код алгоритма сортировки слиянием с динамическим выделением памяти с использованием Malloc. На самом деле, этот malloc используется для выделения памяти для вспомогательного массива, используемого в Merge() . Все было в порядке, когда я использовал статический массив для B, но теперь, когда я использую Malloc, он выдает неизвестную ошибку, как упоминалось выше. Спасибо за любую помощь, которую вы можете оказать!

 #include <stdio.h>
#include<stdlib.h>

void printArray(int *A, int n)
{
    for (int i = 0; i < n; i  )
    {
        printf("%d ", A[i]);
    }
    printf("n");
}

void merge(int A[], int mid, int low, int high)
{
    int i, j, k;
    int* B = (int *)malloc((high-low 1)*sizeof(int));
    i = low;
    j = mid   1;
    k = low;

    while (i <= mid amp;amp; j <= high)
    {
        if (A[i] < A[j])
        {
            B[k] = A[i];
            i  ;
            k  ;
        }
        else
        {
            B[k] = A[j];
            j  ;
            k  ;
        }
    }
    while (i <= mid)
    {
        B[k] = A[i];
        k  ;
        i  ;
    }
    while (j <= high)
    {
        B[k] = A[j];
        k  ;
        j  ;
    }
    for (int i = low; i <= high; i  )
    {
        A[i] = B[i];
    }

    free(B);
    
}

void mergeSort(int A[], int low, int high){
    int mid; 
    if(low<high){
        mid = (low   high) /2;
        mergeSort(A, low, mid);
        mergeSort(A, mid 1, high);
        merge(A, mid, low, high);
    }
}

int main()
{
    // int A[] = {9, 14, 4, 8, 7, 5, 6};
    int A[] = {9, 1, 4, 14, 4, 15, 6};
    int n = 7;
    printArray(A, n);
    mergeSort(A, 0, 6);
    printArray(A, n);
    return 0;
}
 

Сообщение об ошибке

Комментарии:

1. Вы выделили память не для всего массива, а только для небольшой части массива. Так B[k] что это не сработает. Вам нужно B[k-low] . Аналогично B[i] должно быть B[i-low] .

Ответ №1:

Здесь, после выделения памяти high - low 1 целых чисел для B, индексация B начнется с 0 и закончится на high - low 1 . Таким образом, каждый индекс B должен находиться между этими пределами.

Итак, вы должны заменить выражения B[i] и B[k] на B[i - low] и B[k - low] соответственно.