C ++中的合并排序:分段错误
mergesort in c++:segmentation fault
我在实现归并排序时遇到分段错误。
我已经检查了 bounds.I 中的数组,希望得到一些帮助,以找出我去了哪里 wrong.I 已经尝试了小数组的输入,例如大小为 10 的数组,我将 temp 的大小设置为静态(> 10).我已经拔头发好几个小时了。
更新:我只需要更改 mid=(low+high)/2。
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
void merges(int arr[],int low,int mid,int high)
{
int i=low,j=mid+1,k=0;
int temp[high-low+1];
while(i<=mid && j<=high)
{
if(arr[i]<arr[j])
{
temp[k++]=arr[i];
i++;
}
else
{
temp[k++]=arr[j];
j++;
}
}
if(i>mid)
{
while(j<=high)
{
temp[k++]=arr[j];
j++;
}
}
else
{
while(i<=mid)
{
temp[k++]=arr[i];
i++;
}
}
j=0;
for(i=low;i<=high;i++)
{
arr[i]=temp[j++];
}
}
void mergesort(int arr[],int low,int high)
{
if(low<high)
{
int mid=low+high/2;
mergesort(arr,low,mid);
mergesort(arr,mid+1,high);
merges(arr,low,mid,high);
}
}
int main(){
int n;
cin >> n;
int arr[n];
for(int arr_i = 0;arr_i < n;arr_i++){
cin >> arr[arr_i];
}
int i,j,k;
mergesort(arr,0,n-1);
for(i=0;i<n;i++)
cout<<arr[i];
return 0;
}
您正在递归调用合并排序。尽管您的一般情况似乎是合法的,但我无法确定您的基本情况(即退出递归)。
我只需要改变mid=(low+high)/2。感谢@Gerado Gálvez 的建议
我在实现归并排序时遇到分段错误。 我已经检查了 bounds.I 中的数组,希望得到一些帮助,以找出我去了哪里 wrong.I 已经尝试了小数组的输入,例如大小为 10 的数组,我将 temp 的大小设置为静态(> 10).我已经拔头发好几个小时了。
更新:我只需要更改 mid=(low+high)/2。
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
void merges(int arr[],int low,int mid,int high)
{
int i=low,j=mid+1,k=0;
int temp[high-low+1];
while(i<=mid && j<=high)
{
if(arr[i]<arr[j])
{
temp[k++]=arr[i];
i++;
}
else
{
temp[k++]=arr[j];
j++;
}
}
if(i>mid)
{
while(j<=high)
{
temp[k++]=arr[j];
j++;
}
}
else
{
while(i<=mid)
{
temp[k++]=arr[i];
i++;
}
}
j=0;
for(i=low;i<=high;i++)
{
arr[i]=temp[j++];
}
}
void mergesort(int arr[],int low,int high)
{
if(low<high)
{
int mid=low+high/2;
mergesort(arr,low,mid);
mergesort(arr,mid+1,high);
merges(arr,low,mid,high);
}
}
int main(){
int n;
cin >> n;
int arr[n];
for(int arr_i = 0;arr_i < n;arr_i++){
cin >> arr[arr_i];
}
int i,j,k;
mergesort(arr,0,n-1);
for(i=0;i<n;i++)
cout<<arr[i];
return 0;
}
您正在递归调用合并排序。尽管您的一般情况似乎是合法的,但我无法确定您的基本情况(即退出递归)。
我只需要改变mid=(low+high)/2。感谢@Gerado Gálvez 的建议