我的 quickSort() 程序不能正常工作,为啥? [关闭]
Posted
技术标签:
【中文标题】我的 quickSort() 程序不能正常工作,为啥? [关闭]【英文标题】:My quickSort() program cannot work well, why? [closed]我的 quickSort() 程序不能正常工作,为什么? [关闭] 【发布时间】:2015-11-15 07:20:18 【问题描述】:如果你能帮助我,真的很感谢!下面是我对数字向量(双精度型)进行排序的代码。 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);
【问题讨论】:
不能正常工作是什么意思?在问题中提供信息,而不是期望我们从图片中收集信息。 进程停止在绿线,我找不到原因。真的很郁闷。 通常您应该在问题中包含文本错误消息,而不是显示屏幕截图。 错误信息是“线程 1:EXC_BAD_ACCESS (code = 2, address=0x7fff5f3fffd8)”。程序停在绿线处。 @WBLee 使用Insturments中的Zombie工具找出问题的原因,更多细节:***.com/a/11717981/2128327 【参考方案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;
?当你在比较中使用 NO 保存
值,但从vec[start]
重新读取,可以通过向量中的swap
操作改变。毕竟你订购了start
,但是你的索引在订购周期for (int i = start + 1; i <= end; i++)
中增加了,所以在迭代之后你
有(当然,如果以前的错误已修复):
pivot
, sub array <= pivot
, sub array > pivot
,所以你需要而不是只是 swap
如果从 end
到 start + 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));
注意:我使用c++11
(initializer_list),但仅用于测试,因此无需测试您可以重用c++98
或c++03
【讨论】:
以上是关于我的 quickSort() 程序不能正常工作,为啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章