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

Posted

技术标签:

【中文标题】归并排序算法问题:不同的输出【英文标题】:merge sort algorithm problem: different outputs 【发布时间】:2021-02-08 17:37:11 【问题描述】:

当合并发生时,我正在执行合并排序并打印所有通道。我的朋友也在做同样的事情。我们得到了两个不同的输出。我们似乎找不到问题所在。请帮忙!

问题是我在数组中有 6 个成员时只获得了 5 次传球,而我的朋友在相同的 6 位数字上获得了 13 次传球,我们的男女同校几乎相同(根据我们的说法)。我们调用了相同的东西,并且将打印通行证语句放在了相同的位置。

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

第一个代码:

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

输出:OP

第二个代码:

#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]);
    

输出:OP

提前致谢。

【问题讨论】:

m_sort(0,mid); 你能把这个放到答案中,这样我就可以把绿色的勾放在那里吗? 【参考方案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);
    

另请注意,第一个代码使用局部变量,除了仅用于显示阶段的 size。第二个程序无缘无故地使用了太多的全局变量。

【讨论】:

以上是关于归并排序算法问题:不同的输出的主要内容,如果未能解决你的问题,请参考以下文章

证明归并排序输出输入的排列

在路上---学习篇Python 数据结构和算法 --希尔排序归并排序

排序算法--归并排序

AcWing 107. 超快速排序(归并排序 + 逆序对)

算法排序02——归并排序介绍及其在分治算法思想上与快排的区别(含归并代码)

PHP实现归并排序算法(代码实例)