merge_sort работает и не работает в некоторых условиях (номер ввода) - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть этот код c для сортировки слиянием. Код работает хорошо, когда N <= 4, но не работает, когда N> 4. Если я введу 4 для N и введу 4 числа, результат покажет, как следует. Однако, когда я ввожу 6 и ввожу 6 цифр, программа останавливается на несколько секунд и ничего не выдает в результате. Что я могу сделать, чтобы этот код работал на все случаи жизни (N

#include <stdio.h>
#include <stdlib.h>
#define MAX 100000
void Merge(int* arr, int p, int q, int r);
void MergeSort(int *arr,int p, int r);
int main(void)
{
    int N, i;
    int *arr ;

    scanf("%d", &N);

    if ((N>MAX) || (N<1))
        return -1;

    arr = (int*)malloc(sizeof(int)*N);



    for (i = 0; i<N; i++)
        scanf("%d", &arr[i]);

    MergeSort(arr, 0, N - 1);

    for (i = 0; i<N; i++)
        printf("%d\n", arr[i]);

    free(arr);
}

void Merge(int *arr, int left, int mid, int right)
{
    int i,i1,i2;
    int b[right-left+1];

    for(i=left, i1=left, i2=mid+1;i<=right && i1<=mid && i2<=right;i++ ){
        if(arr[i1]>arr[i2])
            b[i]=arr[i1++];
        else
            b[i]=arr[i2++];
    }
    for(i; i<=right;i++){

        if(i1<=mid)
            b[i]=arr[i1++];
        if(i2<=right)
            b[i]=arr[i2++];
    }
    for(i=left;i<=right;i++)
        arr[i] = b[i];
}

void MergeSort(int *arr, int left, int right)
{
    int mid;

    if (left<right){

        mid = (left + right) / 2;
        MergeSort(arr, left, mid);
        MergeSort(arr, mid + 1, right);
        Merge(arr, left, mid, right);
    }
    else
        return;
}
...