Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在合并排序中获取错误的访问错误_C++_Mergesort - Fatal编程技术网

C++ 在合并排序中获取错误的访问错误

C++ 在合并排序中获取错误的访问错误,c++,mergesort,C++,Mergesort,当我运行合并排序的实现时,会弹出与错误访问相关的错误。我的逻辑有问题吗?或者我在某处使用内存的方式不正确 #include <iostream> #include <vector> #include <stdlib.h> #include <time.h> using namespace std; vector<int> mergeIt(vector<int> l, vector<int> r); void p

当我运行合并排序的实现时,会弹出与错误访问相关的错误。我的逻辑有问题吗?或者我在某处使用内存的方式不正确

#include <iostream>
#include <vector>
#include <stdlib.h>
#include <time.h>
using namespace std;

vector<int> mergeIt(vector<int> l, vector<int> r);
void print(const vector<int> &vec);

vector<int> mergesort(vector<int> arr, int lo, int high) {
  if(arr.size() <= 1) return arr;

  int mid = lo + (high-lo)/2;
  vector<int> b(mid);
  vector<int> c(high-mid);

  for(int i = 0; i < mid; i++) {
    b.push_back(arr[i]);
  }
  for(int i = mid; i < high; i++)
    c.push_back(arr[i]);

  vector<int>sb = mergesort(b,lo,high/2);
  vector<int>sc = mergesort(c,mid,high);
   print(sb);
   print(sc);
   return mergeIt(sb,sc);
}

vector<int> mergeIt(vector<int> l, vector<int> r) {
  vector<int> p(l.size()+r.size());
  int li=0, ri=0, pi = 0;

  while(li < l.size() && ri < r.size()) {
      if(l[li] <= r[ri])
    p[pi++] = l[li++];
      else if(l[li] > r[ri])
    p[pi++]= r[ri++];
  }
  //add in the rest of elements if they have not been added yet
  if(li < l.size()) {
    for(int i = li; i < l.size(); i++) p[pi++] = l[i];
  }
  else{
    for(int i = ri; i < r.size(); i++) p[pi++] = r[i];
  }
  return p;
}

vector<int> mergesort(vector<int> arr) {
    int lo = 0;
    int high = arr.size();
    return mergesort(arr,lo,high);
}
int main(int argc, char *argv[]) {
  //test client
  vector<int> nums;
  srand(time(NULL));
  for(int i = 0; i < 10; i++) {
    nums.push_back(rand()%10+1);
  }
  vector<int> p = mergesort(nums);
  for(int i = 0; i < p.size(); i++) cout << p[i];
  return 0;
}

请帮助我,作为初学者C++,在运行时处理错误的经验不多。p> 问题不止一个

在这里,您构建了两个向量,一个是中间元素,另一个是中间元素。因为您使用push_back分层填充它们,所以您应该将它们构建为空(使用默认构造函数)

向量b(mid);
向量c(高-中);
然后

vectorsb=mergesort(b、lo、high/2);
vectorsc=合并排序(c、中、高);
在这里,由于您对完整向量进行排序,因此不需要传递索引(这是错误的)。您可以在范围(0,vector.size())上运行算法并去掉这两个整数


那么您最好学习如何使用调试器。可能还有一些我没有注意到的问题。

你这样做,我看不出有任何理由
lo
high
。您已经将其划分为子向量和递归。向量是你的分区
lo
high
是无用的。你本质上是在要求社区为你调试你的问题。你应该自己做这件事,缩小问题范围,然后向人们询问具体问题。我建议用所需的容量和大小初始化它们,然后不要使用
push_back
,而是使用赋值。@tobi303真有趣。我打算建议只使用std::vector的迭代器对构造函数,从而调整和初始化子向量。比如说什么。
Process 369 stopped
* thread #1: tid = 0x14fe, 0x00007fff8d9c4297 libsystem_malloc.dylib`szone_malloc_should_clear + 20, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=2, address=0x7fff5f3fffb4)
    frame #0: 0x00007fff8d9c4297 libsystem_malloc.dylib`szone_malloc_should_clear + 20
libsystem_malloc.dylib`szone_malloc_should_clear + 20:
-> 0x7fff8d9c4297:  movl   %edx, -0xac(%rbp)
   0x7fff8d9c429d:  movq   %rsi, %r14
   0x7fff8d9c42a0:  movq   %rdi, %r12
   0x7fff8d9c42a3:  movq   %r12, -0x68(%rbp)
  vector<int> b(mid);
  vector<int> c(high-mid);
vector<int>sb = mergesort(b,lo,high/2);
vector<int>sc = mergesort(c,mid,high);