我写了一个鸡尾酒排序算法,并通过生成大小为500到10,000的随机向量来测试它 - 每个向量运行10次。在大约2000-3000长度矢量标记之后,代码段错误。我希望它不是测试代码,因为相同的测试用于多种排序算法,并且它对于其他所有算法都运行良好。我假设某个地方我错过了一个结束条件,它试图访问一个不存在的输入数组元素......但我不完全确定这是否会导致运行段错误。
这是代码,我希望有人能发现我的错误。 (我也会对它如何变得更好有任何评论 - 但请注意我对这段代码的速度可读性很重要。)
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);
}
这是不作业。
答案 0 :(得分:3)
如果使用A.at(i)而不是A [i],则将完成边界检查,并抛出超出范围的异常。这可能有助于调试。
在我看来,访问在这里...
for(int i = firstIndex-1; i < lastIndex; i++) {
if(A[i] > A[i+1]) {
当firstIndex为零(主循环的第一次迭代)时,将超出范围。
答案 1 :(得分:0)
这可能对您有所帮助
import java.util.Scanner;
public class CocktailSort {
static Scanner in;
public static void main(String args[]) {
in = new Scanner(System.in);
int[] data = new int[10];
int i, n = 10, c;
System.out.print("\nEnter the data");
for (i = 0; i < 10; i++) {
data[i] = in.nextInt();
}
do {
// Rightward pass will shift the largest element to its correct
// place at the end
for (i = 0; i < n - 1; i++) {
if (data[i] > data[i + 1]) {
data[i] = data[i] + data[i + 1];
data[i + 1] = data[i] - data[i + 1];
data[i] = data[i] - data[i + 1];
}
}
n = n - 1;
// Leftward pass will shift the smallest element to its correct
// place at the beginning
for (i = 10 - 1, c = 0; i >= c; i--) {
if (data[i] < data[i - 1]) {
data[i] = data[i] + data[i - 1];
data[i - 1] = data[i] - data[i - 1];
data[i] = data[i] - data[i - 1];
}
}
c = c + 1;
} while (n != 0 && c != 0);
System.out.print("The sorted elements are:");
for (i = 0; i < 10; i++) {
System.out.print(data[i] + "\t");
}
}
}