我用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编译器)和可变大小的数组的每个人在我的编译器中都不是问题。我已经多次使用它了。我要问的主要是,我的问题是什么算法用法。
答案 0 :(得分:1)
您的主要问题是您用于终止合并排序的条件。当您使用if (left > right)
且left
和right
相同时,mid
与left
相同。所以递归永远不会停止。请使用以下条件。
void mergesort(int arr[],int left,int right)
{
if(left >= right) return ;