C MergeSort函数中的异常行为

C MergeSort函数中的异常行为,c,sorting,merge,mergesort,C,Sorting,Merge,Mergesort,我是编程新手,我试图在我的程序中实现一个合并排序函数,但它不能正常工作。我一遍又一遍地检查代码,但找不到问题所在 例如,如果6元素数组的用户输入为:3 2 4 1 6 7 输出为:123443270832708 有人能帮我吗?此外,如果有人对改进我的编码风格有任何建议,我们将不胜感激。谢谢 #include <stdio.h> #include <stdlib.h> int main(void) { int *a, n; a = malloc(100

我是编程新手,我试图在我的程序中实现一个合并排序函数,但它不能正常工作。我一遍又一遍地检查代码,但找不到问题所在

例如,如果6元素数组的用户输入为:
3 2 4 1 6 7

输出为:
123443270832708

有人能帮我吗?此外,如果有人对改进我的编码风格有任何建议,我们将不胜感激。谢谢

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

int main(void) {
    int *a, n;

    a = malloc(100 * sizeof(int)); // dynamically allocating memory for original array

    if (a == NULL)
        return 1;

    printf("Enter n of elements in the array:");

    scanf("%i", &n); // n of elements the in array

    printf("Enter elements:\n");

    for (int i = 0; i < n; i++) {
        scanf("%i", &a[i]); // prompt user for input elements
    }

    int f, l, m, n1, n2; // declaring variables

    f = 0;               // first element
    l = n - 1;           // last element
    m = (f + l) / 2;     // mid point
    n1 = m + 1 - f;      // n elements l1
    n2 = l - m;          // n elements l2

    int l1[n1];          // temp array 1
    int l2[n2];          // temp array2

    for (int i = 0; i < n1; i++) {
        l1[i] = a[i];    // copy elements into temp l1
    }
    for (int j = 0; j < n2; j++) {
        l2[j] = a[m + 1 + j]; // copy elements into temp l2
    }

    int i, j, k; // variable for arrays index

    i = 0;
    j = 0;
    k = 0;

    //sorting and copying elements in original array

    while (i < n1 && j < n2) {
        if (l1[i] <= l2[j]) { // if element l1 smaller or equal to l2 element
            a[k] = l1[i];     // copy element l1 into original array
            i++;              // increment l1
        } else {              // if element l1 bigger than l2
            a[k] = l2[j];     // copy element l2 into original array
            j++;              // increment l2
        }
        k++; // increment original array
    }

    // copy remaining elements (if any)
    while (i < n1) {
        a[k] = l1[i];
        i++;
        k++;
    }

    while (j < n2) {
        a[k] = l2[i];
        j++;
        k++;
    }

    printf("Your sorted array:\n");

    for (int d = 0; d < n; d++) {
        printf("%i ", a[d]); // print sorted array
    }

    printf("\n");

    free(a); // freeing original array
}
#包括
#包括
内部主(空){
int*a,n;
a=malloc(100*sizeof(int));//为原始数组动态分配内存
如果(a==NULL)
返回1;
printf(“在数组中输入n个元素:”);
scanf(“%i”,&n);//数组中元素的n个
printf(“输入元素:\n”);
对于(int i=0;i如果(l1[i]您需要递归合并。您只编写了合并部分,而没有编写递归排序函数

更多信息:

#包括
#包括
无效合并(整数arr[],整数l,整数m,整数r)
{ 
int i,j,k;
int n1=m-l+1;
int n2=r-m;
/*创建临时阵列*/
int L[n1],R[n2];
/*将数据复制到临时数组L[]和R[]*/
对于(i=0;iif(L[i]我明白了,谢谢Jacob。有没有一个排序函数不是递归完成的?只是为了更清楚地了解实际的“引擎盖下”编码。我冒昧地修复了数组分配并简化了对
mergeSort()的初始调用
。I/O工作应该在一个独立于合并排序算法的函数中进行。I/O可以留在
main()
,但需要一个独立的
mergesort()
函数来对数组进行排序。对于100个元素,实际上不需要使用
malloc()
-只需在
main()中本地声明数组即可
。如果数组大小达到MB左右,则停止使用本地数组,但在此之前,不需要仅根据大小进行动态分配。您应该检查用户是否尝试向100元素数组中添加200个数字。
#include <stdio.h>
#include <stdlib.h>

void merge(int arr[], int l, int m, int r) 
{ 
    int i, j, k; 
    int n1 = m - l + 1; 
    int n2 = r - m; 
  
    /* create temp arrays */
    int L[n1], R[n2]; 
  
    /* Copy data to temp arrays L[] and R[] */
    for (i = 0; i < n1; i++) 
        L[i] = arr[l + i]; 
    for (j = 0; j < n2; j++) 
        R[j] = arr[m + 1 + j]; 
  
    /* Merge the temp arrays back into arr[l..r]*/
    i = 0; // Initial index of first subarray 
    j = 0; // Initial index of second subarray 
    k = l; // Initial index of merged subarray 
    while (i < n1 && j < n2) { 
        if (L[i] <= R[j]) { 
            arr[k] = L[i]; 
            i++; 
        } else { 
            arr[k] = R[j]; 
            j++; 
        } 
        k++; 
    } 
  
    /* Copy the remaining elements of L[], if there are any */
    while (i < n1) { 
        arr[k] = L[i]; 
        i++; 
        k++; 
    } 
  
    /* Copy the remaining elements of R[], if there are any */
    while (j < n2) { 
        arr[k] = R[j]; 
        j++; 
        k++; 
    } 
} 

void mergeSort(int arr[], int l, int r) 
{ 
    if (l < r) { 
        // Same as (l+r)/2, but avoids overflow for 
        // large l and h 
        int m = l + (r - l) / 2; 
  
        // Sort first and second halves 
        mergeSort(arr, l, m); 
        mergeSort(arr, m + 1, r); 
  
        merge(arr, l, m, r); 
    } 
}

int main(void)
{
    int *a, n;

    printf("Enter n of elements in the array:");
    scanf("%i", &n); //n of elements the in array

    a = malloc(n * sizeof(int)); //dynamically allocating memory for original array
    if (a == NULL)
        return 1;

    printf("Enter elements:\n");

    for (int i = 0; i < n; i++) {
        scanf("%i", &a[i]); //prompt user for input elements
    }
    
    mergeSort(a, 0, n - 1);
    
    printf("Your sorted array:\n");

    for (int d = 0; d < n; d++) {
        printf("%i ", a[d]); //print sorted array
    }
    printf("\n");

    free(a); //freeing original array
    return 0;
}