c ++中的合并排序程序无法正常工作

时间:2017-12-08 06:07:15

标签: c++ algorithm runtime-error c++14 mergesort

我用c ++编写了这个程序来实现合并排序算法,但它似乎给出了运行时错误。当我输入数组元素的数据时,它停止响应。现在,我不知道还要写什么,因为堆栈溢出不能接受主要是代码的问题,所以这是我的代码。请有人告诉我导致错误的原因。

#include <iostream>
using namespace std;

void merge(int arr[], int left, int mid, int right) 
{
    int i, j, count = left, l[mid-left +1], r[right-mid];
    for(i = 0; i <= mid-left; i++)
    {
        l[i] = arr[left + i];
    }
    for(j = 0; j <= right-mid-1; j++)
    {
        r[j] = arr[j + mid + 1];
    }

    i = j = 0;
    while(i <= mid-left && j <= right-mid-1)
    {
        if(l[i] <= r[j])
        {
            arr[count] = l[i];
            i++;
        }
        else if(r[j] < l[i])
        {
            arr[count] = r[j];
            j++;
        }
        count++;
    }
   while(i <= mid-left)
   {
        arr[count] = l[i];
        i++;count++;
   }
   while(j <= right-mid-1)
   {
        arr[count] = r[j];
        j++;count++;
   }
}
void mergesort(int arr[], int left, int right)
{
    if(left > right) return;
    int mid = (left + right)/2;

    mergesort(arr, left, mid);
    mergesort(arr, mid+1, right);

    merge(arr, left, mid, right);
}
int main()
{
    int n;
    cout<<"No. of elements : ";
    cin>>n;
    int arr[n] ;
    for(int i=0;i<n;i++)
    {
        cin>>arr[i];
    }
    mergesort(arr,0,n-1);
    cout<<"sorted array : \n";
    for(int i=0;i<n;i++)
    {
        cout<<arr[i]<<" ";
    }
    return 0;
}

编辑:我正在使用c ++ 14(GCC编译器)和可变大小的数组的每个人在我的编译器中都不是问题。我已经多次使用它了。我要问的主要是,我的问题是什么算法用法。

1 个答案:

答案 0 :(得分:1)

您的主要问题是您用于终止合并排序的条件。当您使用if (left > right)leftright相同时,midleft相同。所以递归永远不会停止。请使用以下条件。

void mergesort(int arr[],int left,int right)
{
    if(left >= right) return ;