我的合并排序实现仅部分工作,有时甚至会引发seg错误。
输入:5 4 3 2 1 输出:0 1 2 3 4
输入:7 6 5 4 3 2 1 输出:0 1 2 3 4 5 6
输入:4 3 2 1 输出:[一些垃圾值] 1 2 3
输入:1 2 3 4 5 67 7 8 输出:[一些垃圾值] 1 2 3 4 5 7 8
似乎奇数编号的输入不会导致seg错误,但偶数编号的输入不会。但是,在这两种情况下,最大值都没有出现在输出中。任何帮助将不胜感激。
void merge(vector<int>& a, int i, int j)
{
int b[a.size()];
int start = i;
int mid = (i+j)/2;
int k = mid+1;
int l = i;
while(i<=mid && k<=j)
{
if(a[i] >= a[k])
b[l++] = a[k++];
else
b[l++] = a[i++];
}
if(i>mid)
{
while(k<=j)
b[l++] = a[k++];
}
else
{
while(i<=mid)
b[l++] = a[i++];
}
for(l=start; l<=j; l++)
a[l] = b[l];
}
void merge_sort(vector<int>& a, int l, int u)
{
int m;
if(l < u)
{
m = (l+u)/2;
merge_sort(a,l,m);
merge_sort(a,m+1,u);
merge(a,l,u);
}
}
//relevant portion in main
cin >> n;
cout << "n: " << n << endl;
a.resize(n);
for(int j=0; j<n; j++)
cin >> a[j];
cout << endl;
merge_sort(a, 0, a.size());
答案 0 :(得分:0)
当j
可能是...<= j...
时,您不应该前往j
(“a.size()
”)。试试a.size() - 1
。