简体   繁体   English

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

[英]merge sort algorithm problem: different outputs

I was doing merge sort with printing all the passes when the merging happens.当合并发生时,我正在做合并排序并打印所有通行证。 my friend was doing the same.我的朋友也在做同样的事情。 we got two different outputs.我们得到了两个不同的输出。 and we can't seem to find the problem.而且我们似乎找不到问题所在。 Please help!请帮忙!

The problem is I am getting only 5 passes with 6 members in the array and my friend is getting 13 passes for the same 6 digits, our coed is almost identical (according to us).问题是我在数组中有 6 个成员时只获得 5 次传球,而我的朋友在相同的 6 位数字上获得 13 次传球,我们的男女同校几乎相同(根据我们的说法)。 We are calling the same things and have put the printing passes statement at the same place.我们正在调用相同的东西并将打印通行证声明放在同一个地方。

I am giving whole codes, and the outputs:我给出了完整的代码和输出:

1st code:第一个代码:

#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");
}

Output: OP Output:操作

2nd code:第二个代码:

#include <stdio.h>

int arr[50];
int n; 
int pass_count = 0;

void m_sort(int start, int end);
void merge(int start, int mid, int end);

int main() {
    int i;

    printf("\n\n______________MERGE SORT____________\n\n");

    printf("\n  HOW MANY ELEMENTS WOULD YOU LIKE TO ENTER? ");
    scanf("%d", &n);
    printf("  Give Array: ");
    for (i = 0; i < n; i++)
        scanf("%d", &arr[i]);

    printf("\nYOUR ARRAY: ");
    for (i = 0; i < n; i++) 
        printf("%d  ", arr[i]);
    
    m_sort(0, n - 1);
    printf("\n\n");
}

void m_sort(int start, int end) {
    if (start < end) {
        int mid = (start + end) / 2;
        m_sort(0, mid);
        m_sort(mid + 1, end);
        merge(start, mid, end);
    }
}

void merge(int start, int mid, int end) {
    int i, j, k;
    int n1, n2;
    n1 = mid - start + 1;
    n2 = end - mid;
    int left_arr[n1], right_arr[n2];

    for (i = 0; i < n1; i++)
        left_arr[i] = arr[start + i];
    for (j = 0; j < n2; j++)
        right_arr[j] = arr[mid + 1 + j];
    
    i = 0;
    j = 0;
    k = start;
    
    while (i < n1 && j < n2) {
        if (left_arr[i] <= right_arr[j]) {
            arr[k] = left_arr[i];
            i++;
        } else {
            arr[k] = right_arr[j];
            j++;
        }
        k++;
    }

    while (i < n1) { 
        arr[k] = left_arr[i];
        i++;
        k++;
    }
    while (j < n2) {
        arr[k] = right_arr[j];
        j++;
        k++;
    }
    
    pass_count = pass_count + 1;
    printf("\nPASS %d: ", pass_count);    // PASSES
    //displaying passes
    for (i = 0; i < n; i++) 
        printf("%d ", arr[i]);
    }

Output: OP Output:操作

Thanks in advance.提前致谢。

The fist program is correct.第一个程序是正确的。

The second program has a bug in the m_sort() function: the recursive calls use incorrect index values.第二个程序在m_sort() function 中有一个错误:递归调用使用了不正确的索引值。 It should be:它应该是:

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);
    }
}

Note also that the first code uses local variables except size that is only used to display the phases.另请注意,第一个代码使用局部变量,但size仅用于显示阶段。 The second program uses too many global variables for no good reason.第二个程序无缘无故地使用了太多的全局变量。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM