【发布时间】: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<int>。 -
@Zebrafish GCC 扩展允许在 C++ 中使用 VLA。
-
@Yashas 并不意味着你应该使用它。 VLA 有很多缺点。例如,输入一百万的
n并观察堆栈溢出时出现的奇怪错误,sizeof不再是编译时间常数。 -
大家好,代码仍然不适用于矢量使用。但主要的是,我认为你们在谈论旧的 c++ 编译器,比如 turbo c++。我使用了 borland 和 GCC 编译器,并且我已经创建了很多次可变大小的数组。
标签: c++ algorithm runtime-error c++14 mergesort