我的合并排序实现 (C++) 有什么问题?

What's wrong with my merge sort implementation (C++)?

本文关键字:什么 问题 C++ 合并 排序 实现 我的      更新时间:2023-10-16

我的合并排序实现只能部分工作,甚至有时会引发 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());

j可以a.size()时,您不应该上升到j(" ...<= j... ")。试试a.size() - 1 .