【问题标题】:Infinite loop problem with the merge sort during the portion recursively calls mergeSort部分递归调用mergeSort期间合并排序的无限循环问题
【发布时间】:2020-10-15 02:45:41
【问题描述】:

我正在做一项家庭作业,比较 10 种不同类型的执行时间和理论 O 表示法。但是,正如问题所说,当我到达代码递归调用合并排序的地步时,我一直有一个无限循环。我知道左边是 2,右边是 3,所以中间连续返回 3。合并应该在 if 语句之外吗?不过,当我看到它时,我认为这也不对。

void merge(int arr[], int left, int middle, int right)
{
    // get the temporary array lengths
    int first = middle - left + 1;
    int second = right - middle;

    // make the temp dynamic arrays
    int *Left = new int(first);
    int *Right = new int(second);
    for (int i = 0; i < first; i++)
    {
       Left[i] = arr[left + i];
    }
    for (int i = 0; i < second; i++)
    {
        Right[i] = arr[middle + 1 + i];
    }

    // merge the arrays back into arr
    int i = 0;
    int j = 0;
    int k = left;

    while (i < first && j < second)
    {
        // check which one is bigger
        if (Left[i] <= Right[j])
        {
            arr[k] = Left[i];
            i++;
        }
        else
        {
            arr[k] = Right[j];
            j++;
        }
        k++;
    }
    // copy Left remainder
    while (i < first)
    {
        arr[k] = Left[i];
        i++;
        k++;
    }
    // copy right remainder
    while (j < second)
    {
        arr[k] = Right[j];
        j++;
        k++;
    }
}

void mergeSort(int arr[], int left, int right)
{
    if (left < right)
    {
        int middle = left + (right - 1) / 2;
        mergeSort(arr, left, middle);
        mergeSort(arr, middle + 1, right);
        merge(arr, left, middle, right);
    }
}

【问题讨论】:

    标签: c++ infinite-loop mergesort


    【解决方案1】:

    mergeSort 函数中,您在计算middle 时忘记了括号。应该是:

    int middle = (left + (right - 1)) / 2;
    

    另外,在merge 函数中,LeftRight 应该具有int[] 类型。而不是new int(SIZE),您应该使用new int[SIZE]。此外,您应该在离开函数之前使用delete[]将它们删除,以防止内存泄漏。

    // make the temp dynamic arrays
    int* Left = new int[first];
    int* Right = new int[second];
    
    // ...
    
    // at the end of the `merge` function
    delete[] Left;
    delete[] Right;
    

    【讨论】:

    • 非常感谢!是的,我非常努力地搞砸了动态数组。我从来不需要在我通常做的事情中使用它们。
    • 不客气!如果这有帮助,请将其标记为已接受的答案,谢谢:)
    猜你喜欢
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2014-12-15
    • 2016-07-15
    相关资源
    最近更新 更多