我正在为一个项目工作,我必须实现不同的排序算法。其中一个是随机快速排序,但我的随机数总是设置为-800百万,即使在设置了srand并设置了一个数字范围来挑选,导致堆栈溢出错误。
我已经尝试了所有我能想到的东西,这并不多。我尝试在另一个.cpp文件中创建一个随机数生成器,它工作正常,它只是因为某些原因在这种情况下不起作用。我只是不明白它是如何不正确生成随机数的。
void randomizedQuickSort(int arr3[], int start, int end) {
int temp, pivot;
int s = start, e = end;
srand(time(0)); //<------------------------ ERROR THROWN
// Partitioning
while (s <= e) {
pivot = 0 + (rand() % 5);
while (arr3[s] < pivot)
s++;
while (arr3[e] > pivot)
e--;
if (s <= e) {
temp = arr3[s];
arr3[s] = arr3[e];
arr3[e] = temp;
s++;
e--;
}
// Recursion
if (start < e)
randomizedQuickSort(arr3, start, e);
if (s < end)
randomizedQuickSort(arr3, s, end);
}
}
我希望数字在0到4之间,但每次都会产生-858,993,460。这是错误和变量值的屏幕截图:
你遇到的最可能的问题是太深的递归调用,它会溢出堆栈。此外,您在每次递归调用中都不需要srand()
。 srand()
只是初始化随机数生成器,它通常只执行一次,但不是在每个循环步骤中。把它放在randomizedQuickSort()
之外。只需在程序开头调用srand(time(0));
(如果你在单独的线程中执行它,则调用当前线程)。
您在“Watch / Autos”Visual Studio窗口中对pivot
有负值,因为它在堆栈溢出时尚未初始化,从而中断程序执行。
另外(正如斯特凡回答的那样)你可以在这里溢出阵列边界
while (arr3[s] < pivot)
s++;
while (arr3[e] > pivot)
e--;
检查s
和e
是否在start
和end
的范围内:
while (arr3[s] < pivot && s < end - 1)
s++;
while (arr3[e] > pivot && e > start)
e--;
或者在pivot
和start
之间为end
指定一个随机数组元素的值,而不是在某个范围内的随机值。
如果您仍然会有堆栈溢出,请使算法迭代或在您排序的数据数组中放入更少的元素。
还有一件事:
这个:
pivot = 0 + (rand() % 5);
while (arr3[s] < pivot)
s++;
对于:
int arr3[] = { 1212, 1341, 61255, 1325, 125 };
使s
超出范围,即:s将比实际的数组长度更大。
这可能会导致意外行为。