merge_sort有效,在某些情况下不起作用(输入数字)

时间:2018-09-10 10:16:38

标签: c algorithm sorting mergesort

我有此C代码用于合并排序。 当N <= 4时,代码运行良好,但当N> = 4时,代码则无法运行。 如果我在N中输入4,然后输入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;
}

0 个答案:

没有答案