Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 合并排序算法问题:不同的输出_C_Algorithm_Sorting_Mergesort_Divide And Conquer - Fatal编程技术网

C 合并排序算法问题:不同的输出

C 合并排序算法问题:不同的输出,c,algorithm,sorting,mergesort,divide-and-conquer,C,Algorithm,Sorting,Mergesort,Divide And Conquer,当合并发生时,我正在进行合并排序,打印所有过程。我的朋友也在做同样的事。我们有两种不同的输出。我们似乎找不到问题所在。请帮忙 问题是我在数组中只有6个成员的5次通过,而我的朋友在相同的6个数字中获得13次通过,我们的coed几乎相同(根据我们的说法)。我们正在调用相同的东西,并已将“打印通行证”语句放在相同的位置 我给出了完整的代码和输出: 第1代码: #include <stdio.h> int size; int merge(int arr[], int l, int m,

当合并发生时,我正在进行合并排序,打印所有过程。我的朋友也在做同样的事。我们有两种不同的输出。我们似乎找不到问题所在。请帮忙

问题是我在数组中只有6个成员的5次通过,而我的朋友在相同的6个数字中获得13次通过,我们的coed几乎相同(根据我们的说法)。我们正在调用相同的东西,并已将“打印通行证”语句放在相同的位置

我给出了完整的代码和输出:

第1代码:

#include <stdio.h>

int size;

int merge(int arr[], int l, int m, int r) {
    int n1 = m - l + 1;
    int n2 = r - m;
    int L[n1], R[n2];

    int i, j;
    for (i = 0; i < n1; i++)
        L[i] = arr[l + i];
    for (j = 0; j < n2; j++)
        R[j] = arr[m + 1 + j];

    i = 0, j = 0;
    int k = l;

    while (i < n1 && j < n2) {
        if (L[i] <= R[j]) {
            arr[k] = L[i];
            i++;
        } else {
            arr[k] = R[j];
            j++;
        }
        k++;
    }

    while (i < n1) {           
        arr[k] = L[i];
        i++, k++;
    }
    while (j < n2) {           
        arr[k] = R[j];
        j++, k++;
    }

    printf("\n    pass:  ");                  // PASSES
    for (int x = 0; x < size; x++) {        
        printf("%d  ", arr[x]);
    }
}

int mergesort(int arr[], int l, int r) {
    if (l < r) {
        int m = (l + r) / 2;
        mergesort(arr, l, m);
        mergesort(arr, m + 1, r);
        merge(arr, l, m, r);
    }
}

int main() {
    printf("\n    # MERGE SORT # \n\n");
    int i;
    int arr[20];

    printf("  Enter number of array elements: ");
    scanf("%d", &size);

    printf("  Enter array elements: ");
    for (i = 0; i < size; i++)
        scanf("%d", &arr[i]);

    mergesort(arr, 0, size - 1);

    printf("\n\n  Sorted array: ");
    for (i = 0; i < size; i++)
        printf("%d ", arr[i]);
    
    printf("\n\n\n");
}
#包括
整数大小;
整数合并(整数arr[],整数l,整数m,整数r){
int n1=m-l+1;
int n2=r-m;
int L[n1],R[n2];
int i,j;
对于(i=0;i如果(L[i]第一个程序是正确的

第二个程序在
m_sort()
函数中有一个错误:递归调用使用了不正确的索引值。它应该是:

void m_sort(int start, int end) {
    if (start < end) {
        int mid = (start + end) / 2;
        m_sort(start, mid);         // instead of m_sort(0, mid)
        m_sort(mid + 1, end);
        merge(start, mid, end);
    }
}
void m_排序(int开始,int结束){
如果(开始<结束){
int mid=(开始+结束)/2;
m_排序(开始,中间);//代替m_排序(0,中间)
m_排序(中间+1,结束);
合并(开始、中间、结束);
}
}

还请注意,第一个代码使用局部变量,除了仅用于显示相位的
大小
。第二个程序使用太多全局变量是没有充分理由的。

第一个程序是正确的

第二个程序在
m_sort()
函数中有一个错误:递归调用使用了不正确的索引值。它应该是:

void m_sort(int start, int end) {
    if (start < end) {
        int mid = (start + end) / 2;
        m_sort(start, mid);         // instead of m_sort(0, mid)
        m_sort(mid + 1, end);
        merge(start, mid, end);
    }
}
void m_排序(int开始,int结束){
如果(开始<结束){
int mid=(开始+结束)/2;
m_排序(开始,中间);//代替m_排序(0,中间)
m_排序(中间+1,结束);
合并(开始、中间、结束);
}
}

还请注意,第一个代码使用局部变量,除了只用于显示阶段的
大小
。第二个程序使用太多全局变量是没有充分理由的。

m_sort(0,mid);
你能把它放到答案中,这样我就可以在那里打绿色勾吗?
m_sort(0,mid)
你能把这个放在答案上,这样我就可以把绿色的勾号放在那里了吗?