c++ - C++中的合并排序程序不起作用

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

最佳答案

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

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

关于c++ - C++中的合并排序程序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47708648/

相关文章:

c++ - 丢弃理论上使用但技术上未使用的功能

java - 如何在具有特定优先级列表的元素之间进行选择?

arrays - 按重量随机元素

java - 如何消除E Zygote?

vba - 错误处理不适用于幻灯片ID

R quantmod buildModel()不适合模型

c++ - 基于字符串对结构数组进行排序

c++ - 坚持 twitcurl

c++ - PNG block 读取器,长度无效

algorithm - 通过 bit twiddling 在循环调度中找到下一个