C- 我的合并排序算法有什么问题?

C- What is the matter of my mergesort algorithm?

我编写了一个合并排序算法的代码,它有两个输入:位数和位数

而且我想打印按我的合并排序函数排序的数组。

但我只能看到运行时间错误.

我认为我的 Merge() 函数产生了 运行 时间错误。但是我在 Merge 函数中找不到 while 循环的 exception..

如何修复此错误并使 运行 合并排序正常运行?

这是我的代码

 #include <stdio.h>

void Merge(int *arr, int s, int e, int m);
void MergeSort(int *arr, int s, int e);

int main(void) {
    int N;
    scanf("%d", &N);
    int arr[N];
    for (int i = 0; i < N; i++) {
        scanf("%d", &arr[i]);
    }
    MergeSort(arr, 0, N - 1);
    for (int i = 0; i < N; i++) {
        printf("%d", arr[i]);
    }
}

void MergeSort(int *arr, int s, int e) {
    printf("hi\n");
    int m;
    if (e - s > 0) {
        m = (s + e) / 2;
        MergeSort(arr, s, m);
        MergeSort(arr, m + 1, e);
        Merge(arr, s, e, m);
    } else {
        return;
    }
}

void Merge(int *arr, int s, int e, int m) {
    int arr_t[e - s + 1];
    int i = s, j = m + 1, idx = s;
    while (1) {
        if (i != m && j != s) {
            if (i <= m && arr[i] <= arr[j]) {
                arr_t[idx] = arr[i];
                i++;
                idx++;
            } else
            if (j <= e) {
                arr_t[idx] = arr[j];
                j++;
                idx++;
            }
        } else
        if (i == m && j != e) {
            arr_t[idx] = arr[j];
            j++;
            idx++;
        } else
        if (i != m && j == e) {
            arr_t[idx] = arr[i];
            i++;
            idx++;
        } else {
            if (arr[i] <= arr[j]) { 
                arr_t[idx] = arr[i];
                idx++;
                arr_t[idx] = arr[j];
            } else {
                arr_t[idx] = arr[j];
                idx++;
                arr_t[idx] = arr[i];
            }
            break;
        }
    }
    for (int k = s; k <= e; k++) {
        arr[k] = arr_t[k];
    }
}

您这部分代码的错误可能是由于:

正如@Some programmer dude 所述,您可能超出了数组之一的范围

您可以使用 while(i<=mid && j<=end) 而不是 while(1) 循环直到合并用完一个或两个部分

N 甚至不用在你的合并函数中使用这么多 else,你可以使用 while() 循环来简化你的 code.You 不应该在你的最后一个临时数组中附加两个值else 子句

甚至 if(i!=m && j!=s) 你的代码中的这个条件看起来有点奇怪。

所以我写了这个示例合并排序供您参考。希望这对您有所帮助!!

#include<stdio.h>
void merge(int a[],int start,int mid,int end){
int i=start,j=mid+1,k=0;
int temp[end-start+1];
while(i<=mid && j<=end){
    if(a[i]<a[j]){
        temp[k]=a[i];
        k+=1;
        i+=1;
    }
    else{
        temp[k]=a[j];
        k+=1;
        j+=1;
    }
}
while(i<=mid){
    temp[k]=a[i];
    i+=1;k+=1;
}
while(j<=end){
    temp[k]=a[j];
    j+=1;k+=1;
}
for(int i=end;i>=start;i--){
    a[i]=temp[--k];
}


}



void mergesort(int a[],int start,int end){
if(start<end){
int mid=(start+end)/2;
mergesort(a,start,mid);
mergesort(a,mid+1,end);
merge(a,start,mid,end);

}
}



void display(int a[],int n){
for(int i=0;i<n;i++)
printf("%d ",a[i]);

}



int main()

{
    int a[5]={5,4,6,2,1};
    int n=sizeof(a)/sizeof(a[0]);
    mergesort(a,0,n-1);
    display(a,n);
}

最坏情况下的时间复杂度为Ο(n log n)