我编写了一个鸡尾酒排序算法,并通过生成大小为 500 到 10,000 的随机 vector 来测试它 - 每个 vector 运行 10 次。在大约 2000-3000 长度的 vector 标记之后,代码出现段错误。我希望这不是测试代码,因为相同的测试用于多种排序算法,并且它对于其他所有算法都运行良好。我假设在某个地方我错过了一个结束条件,并且它尝试访问输入数组中不存在的元素......但我不完全确定这是否会导致运行段错误。
这是代码,希望有人能指出我的错误。 (我也很乐意对如何改进它提出任何评论 - 但请注意,我确实更看重这段代码的可读性而不是速度。)
void Sorting::cocktailSort(vector<int>& A) {
int temp;
// The first/last indexes to check. Anything before/after these indexes
// is already sorted.
int firstIndex = -1;
int lastIndex = A.size()-1;
bool swapped;
do {
firstIndex += 1;
swapped = false;
for(int i = firstIndex-1; i < lastIndex; i++) {
if(A[i] > A[i+1]) {
temp = A[i];
A[i] = A[i+1];
A[i+1] = temp;
swapped = true;
}
}
if(!swapped) break;
swapped = false;
lastIndex -= 1;
for(int i = lastIndex; i >= firstIndex; i--) {
if(A[i] < A[i-1]) {
temp = A[i];
A[i] = A[i-1];
A[i-1] = temp;
swapped = true;
}
}
}while (swapped);
}
这不是家庭作业。
最佳答案
如果使用 A.at(i) 而不是 A[i],则会进行边界检查,并抛出超出范围的异常。这可能有助于调试。
在我看来,这里的访问...
for(int i = firstIndex-1; i < lastIndex; i++) {
if(A[i] > A[i+1]) {
当firstIndex为零(主循环的第一次迭代)时,将出界。
关于c++ - 鸡尾酒排序代码段错误 - 不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3487532/