У меня есть этот код 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;
}