在合并排序中出现错误访问错误
Getting a bad access error in merge sort
当我 运行 我实施合并排序时,弹出与错误访问相关的错误。是我的逻辑有问题还是我在某处以不正确的方式使用了内存?
#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;
}
这是我尝试使用 lldb 调试我的程序时遇到的错误:
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)
请帮忙,因为我是 C++ 的初学者,在 运行 时对处理错误不是很有经验。
不止一个问题。
在这里构建两个向量,一个是中元素,另一个是中高元素。由于您用 push_back 对它们进行分层填充,因此您应该将它们构建为空(使用默认构造函数)
vector<int> b(mid);
vector<int> c(high-mid);
然后
vector<int>sb = mergesort(b,lo,high/2);
vector<int>sc = mergesort(c,mid,high);
这里因为你对完整的向量进行了排序,所以你不需要传递索引(这是错误的)。您可以 运行 您的算法在范围 (0, vector.size()) 上并去掉这两个整数。
那你最好学习如何使用调试器。可能还有其他一些我遗漏的问题。
当我 运行 我实施合并排序时,弹出与错误访问相关的错误。是我的逻辑有问题还是我在某处以不正确的方式使用了内存?
#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;
}
这是我尝试使用 lldb 调试我的程序时遇到的错误:
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)
请帮忙,因为我是 C++ 的初学者,在 运行 时对处理错误不是很有经验。
不止一个问题。
在这里构建两个向量,一个是中元素,另一个是中高元素。由于您用 push_back 对它们进行分层填充,因此您应该将它们构建为空(使用默认构造函数)
vector<int> b(mid);
vector<int> c(high-mid);
然后
vector<int>sb = mergesort(b,lo,high/2);
vector<int>sc = mergesort(c,mid,high);
这里因为你对完整的向量进行了排序,所以你不需要传递索引(这是错误的)。您可以 运行 您的算法在范围 (0, vector.size()) 上并去掉这两个整数。
那你最好学习如何使用调试器。可能还有其他一些我遗漏的问题。