【问题标题】:merge sort program in c++ not workingC ++中的合并排序程序不起作用
【发布时间】:2017-12-08 06:07:14
【问题描述】:

我用 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 编译器),可变大小的数组在我的编译器中不是问题。我已经用过很多次了。我要问的主要问题是,我的有什么问题吗算法使用。

【问题讨论】:

  • C++ 中不允许使用可变长度数组,数组中元素的数量必须是编译已知的常量,因此 int i, j, count = left, l[mid - left + 1 ], r[右-中];不会编译,或者不应该。
  • int arr[n] 也不会编译,因为这也不是有效的 C++ 语法。请改用std::vector&lt;int&gt;
  • @Zebrafish GCC 扩展允许在 C++ 中使用 VLA。
  • @Yashas 并不意味着你应该使用它。 VLA 有很多缺点。例如,输入一百万的n 并观察堆栈溢出时出现的奇怪错误,sizeof 不再是编译时间常数。
  • 大家好,代码仍然不适用于矢量使用。但主要的是,我认为你们在谈论旧的 c++ 编译器,比如 turbo c++。我使用了 borland 和 GCC 编译器,并且我已经创建了很多次可变大小的数组。

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


【解决方案1】:

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

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

【讨论】:

  • 谢谢你,非常感谢。算法现在对我来说完全清楚了。
猜你喜欢
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 2014-03-31
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
相关资源
最近更新 更多