如果你能帮助我,真的非常感谢!下面是我的代码来排序数字向量(类型为double)。 vec中的元素数量为200,000。
几秒钟后,程序停在绿线上。错误消息是
“线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x7fff5f3fffd8)”。
就像图片一样:
/*This is block to call quickSort*/
void VectorDoubleSort:: sort(std::vector<double>& vec){
int start = 0;
int end = vec.size() - 1;
quickSort(vec, start, end);
}
/*This block to fulfill the quickSort method*/
void VectorDoubleSort:: quickSort(std::vector<double>& vec, int start, int end)
{
int pivot = (start + end) / 2;
int smallIndex = start;
if (start < end) {
double tempA = vec[start];
vec[pivot] = tempA;
for (int i = start + 1; i <= end; i++) {
if (vec[i] <= vec[start]) {
smallIndex += 1;
double tempB = vec[i];
vec[i] = vec[smallIndex];
vec[smallIndex] = tempB;
}
}
double tempC = vec[start];
vec[start] = vec[smallIndex];
vec[smallIndex] = tempC;
pivot = smallIndex;
quickSort(vec, start, pivot - 1);
quickSort(vec, pivot + 1, end);
}
}
答案 0 :(得分:1)
首先,这是错误的:
int pivot = (start + end) / 2;
double tempA = vec[start];
vec[pivot] = tempA;
你遗失了vec[pivot]
的内容,之后if (vec[i] <= vec[start])
你丢失了
按vec[start]
的值排序你的向量,然后开始pivot
,然后为什么地狱,
你将枢轴设置为(start + end) / 2;
?正如您在比较 NOT 时使用的那样
值,但从vec[start]
重新读取,可以通过向量中的swap
操作进行更改。毕竟你是针对start
订购的,但你的索引在订购周期for (int i = start + 1; i <= end; i++)
中有所增加,所以在迭代之后你
有(当然如果以前的错误是固定的):
{pivot
,sub array <= pivot
,sub array > pivot
},因此您需要而不仅仅是swap
,如果从end
到start + 1
的索引需要移动{{} {1}}到sub array <= pivot
并插入start
之间,
因此,如果可以重复使用尽可能多的代码,那么正确的解决方案将是:
pivot
注意:我使用#include <algorithm>
#include <cassert>
#include <iostream>
#include <iterator>
#include <vector>
namespace VectorDoubleSort {
void sort(std::vector<double> &vec);
void quickSort(std::vector<double> &vec, int start, int end);
}
void VectorDoubleSort::sort(std::vector<double> &vec) {
if (vec.empty())
return;
int start = 0;
int end = vec.size() - 1;
quickSort(vec, start, end);
}
/*This block to fulfill the quickSort method*/
void VectorDoubleSort::quickSort(std::vector<double> &vec, int start, int end) {
if (start < end) {
const double pivotVal = vec[start];
int smallIndex = end;
for (int i = end; i > start; --i) {
if (vec[i] >= pivotVal) {
std::swap(vec[i], vec[smallIndex]);
--smallIndex;
}
}
std::swap(vec[start], vec[smallIndex]);
const int pivot = smallIndex;
quickSort(vec, start, pivot - 1);
quickSort(vec, pivot + 1, end);
}
}
bool test(const std::vector<double> &arr) {
std::vector<double> good = arr;
std::sort(good.begin(), good.end());
std::vector<double> my = arr;
VectorDoubleSort::sort(my);
std::copy(my.begin(), my.end(),
std::ostream_iterator<double>(std::cout, ", "));
std::cout << "\n";
return my == good;
}
int main() {
assert(test({}));
assert(test({3., 1., 2., 17., 18., -1., -5.}));
assert(test({3., 1., 2.}));
assert(test({3., 2.}));
assert(test({3.}));
assert(test({3., 532523, 5235, 05325, 535, 5738157, 535, 501, 9780, 14}));
}
(initializer_list),但仅用于测试,因此如果没有测试,您可以重复使用c++11
或c++98