【发布时间】:2016-02-29 09:39:27
【问题描述】:
当我用rand() 或任何常量值分配数组值时,为什么这个 C++ 代码 sn-p 的行为会有所不同,我感到非常困惑。
const int MIN_SIZE = 10000;
const int MAX_SIZE = 100000;
int main()
{
for(j = MIN_SIZE; j <= MAX_SIZE; j += MIN_SIZE) {
int *arrPtr = new int[j];
for(int i = 0; i < j; i++)
arrPtr[i] = 1; //When I put rand() here, it works fine but in any constant it gives stack overflow
quickSort(arr, 0, j - 1);
delete []arrPtr;
}
}
上面的代码基本上创建了一个以j 为大小的动态分配数组,它每轮递增MIN_SIZE(10,000),并为每个索引分配一些特定的整数。分配后,它使用快速排序算法进行排序,我将在下面提供我的算法,然后在完成后释放该数组。整个事情重复到MAX_SIZE(100,000)。
这是我的快速排序代码:
void quickSort(int *arr, int front, int rear)
{
if (front < rear)
{
int part = partition(arr, front, rear);
quickSort(arr, front, part - 1);
quickSort(arr, part + 1, rear);
}
}
int partition(int *arr, int front, int rear)
{
int element = arr[rear];
int i = front - 1;
for (int j = front; j<rear; ++j)
{
if (arr[j] <= element)
{
++i;
long temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
long temp = arr[i + 1];
arr[i + 1] = arr[rear];
arr[rear] = temp;
return i + 1;
}
我正在尝试实现快速排序算法,该算法严格使用最后一项作为枢轴。在这种情况下,我面临一个奇怪的问题:当我使用 rand() 函数将数组的每个值分配给一个随机数时,一切正常,但是,当我输入一个常量值时,数组的大小变为高达 4039(当您操作 MAX_SIZE 和 MIN_SIZE 时)然后给出 堆栈溢出 错误。我真的很困惑,为什么这会导致问题,此外,为什么是 4039?
【问题讨论】:
-
查看partition的返回值。我猜你有一个运行方式递归由于分区返回错误的值,导致快速排序整个数组一遍又一遍。
-
这是作业吗?如果是这样,那么在'Net 和 SO 上会有很多关于快速排序的帮助。否则...使用
vector和内置的sort算法。 10 次中有 9 次会比你能写的要快。 -
当数组的所有元素都相同时,是数组已经排序的极端情况,如果数组已经排序,那么使用快速排序会遇到最坏的情况。 See this for an explanation.
-
@JoachimPileborg 是的,我实际上是故意这样做的,以测试它的性能并收集一些数据交换比较次数等方面的数据。然而,这个问题的发生很有趣。有什么建议吗?
-
@DanielJour 但是为什么在 4039 上,这不是很奇怪吗?你发现我的代码中有什么特殊问题吗?
标签: c++ arrays algorithm sorting quicksort