使用 std::vector C++快速排序,EXC_BAD_ACCESS代码 2

Quicksort in C++ with std::vector, EXC_BAD_ACCESS code 2

本文关键字:BAD ACCESS 代码 EXC std vector C++ 快速排序 使用      更新时间:2023-10-16

VS 代码在我运行快速排序算法时捕获此异常: EXC_BAD_ACCESS(代码=2,地址=0x7ffeef3ffffc(。这发生在 partition(( 中的第一行:

int i = p;

我尝试实现Cormen算法:http://www.cs.fsu.edu/~lacher/courses/COP4531/lectures/sorts/slide09.html

为什么我无法访问变量 p?它是否已发布,如果是,我该如何解决此问题?

我的代码

//.h file
void sortVector(vector<int> &vec, int p=0, int r=-2);
int partition(vector<int> &vec, int p, int r);
//.cpp file
int partition(vector<int> &vec, int p, int r) {
int i = p;
for (int j = p; j <r-1; ++j) {
if (vec[j] < vec[r-1]) {
swap(vec[j], vec[r-1]);
i++;
}
swap(vec[i], vec[r-1]);
}
return i;
}
void sortVector(vector<int> &vec, int p, int r) {
if (r == -2) {
r = vec.size();
}
if (p-r<1) {
int q = partition(vec, p, r);
sortVector(vec, p, q);
sortVector(vec, q+1, r);
}
}

我包括Stroustrup中的"std_lib_facilities.h:使用C++编程原理和实践"。

你需要在循环for写出swap(vec[i], vec[r-1]);

应该是这样的——

//.cpp file
int partition(vector<int> &vec, int p, int r) {
int i = p;
for (int j = p; j <r-1; ++j) {
if (vec[j] < vec[r-1]) {
swap(vec[j], vec[r-1]);
i++;
}
}
swap(vec[i], vec[r-1]);
return i;
}

两个函数都存在问题:

分区((:

  • 第一次交换有错误的论点。
  • 第二次掉期必须移出 for-loop(由Faruk Hossain建议(
  • if (vec[j] < vec[r-1])变得if (vec[j] <= vec[r-1])

sortVector((:

  • if (p-r<1)变成了如果(p<r)

下面的工作代码。

int partition(vector<int> &vec, int p, int r) {
int i = p;
for (int j = p; j <r-1; ++j) {
if (vec[j] <= vec[r-1]) {
swap(vec[i], vec[j]);
i++;
}
}
swap(vec[i], vec[r-1]);
return i;
}
void sortVector(vector<int> &vec, int p, int r) {
if (r == -2) {
r = vec.size();
}
if (r>p) {
int q = partition(vec, p, r);
sortVector(vec, p, q);
sortVector(vec, q+1, r);
}
}