gpt4 book ai didi

java - Qucksort 获得 100000 个元素的 StackOverflowError 但 mergesort 在 Java 中没有

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:52:01 27 4
gpt4 key购买 nike

根据 this SO帖子:

The common cause for a stack overflow is a bad recursive call.

那为什么它运行了 10000 个元素却得到了 100000 个元素的 StackOverflowError?

快速排序:

public static void quicksort(int[] data, int low, int high) {
if (low < high) {
int p = partition(data, low, high);
quicksort(data, low, p);
quicksort(data, p + 1, high);
}
}
public static int partition(int[] data, int low, int high) {
int pivot = data[low];
int i = low - 1;
int j = high + 1;
while (true) {
do {
i++;
} while (data[i] < pivot);
do {
j--;
} while (data[j] > pivot);
if (i >= j)
return j;
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}

合并排序:

public static void mergesort(int[] data, int left, int right) {
if (left < right){
int middle = (left + right) / 2;
mergesort(data, left, middle);
mergesort(data, middle+1, right);
merge(data, left, middle, right);
}
}
private static void merge(int[] data, int left, int middle, int right) {
int n1 = middle - left + 1;
int n2 = right - middle;
int[] dataLeft = new int[n1];
int[] dataRight = new int[n2];
for (int i = 0; i < n1; i++)
dataLeft[i] = data[left+i];
for (int i = 0; i < n2; i++)
dataRight[i] = data[middle+1+i];
int i = 0, j = 0, k = left;
while (i < n1 && j < n2) {
if (dataLeft[i] <= dataRight[j]) {
data[k] = dataLeft[i];
i++;
}
else {
data[k] = dataRight[j];
j++;
}
k++;
}
while (i < n1) {
data[k] = dataLeft[i];
i++;
k++;
}
while (j < n2) {
data[k] = dataRight[j];
j++;
k++;
}
}

对于合并排序,它运行得很好。

这是什么原因?谁能解释一下?

最佳答案

这种行为对于选择的具有 pivot int pivot = data[low]; 和排序(或大部分)数组的分区方案是可以预期的 - 在这种情况下,堆栈深度可能达到 N=length of数组

您必须了解更明智的枢轴选择 - 三的中位数随机枢轴索引。这些方法减少了特殊数据集出现不良行为的可能性(但没有完全消除它)

第二步——优化递归方案:

To make sure at most O(log n) space is used, recurse first into the smaller side of the partition, then use a tail call to recurse into the other. So just compare (p-low) and high-p and choose right order of these calls:

    quicksort(data, low, p);
quicksort(data, p + 1, high);

这些问题和更多解决方案将在 Wiki page 中进行简要说明。以及详细信息——在任何算法书籍/类(class)中

请注意,合并排序总是提供最大堆栈深度 log(N)

关于java - Qucksort 获得 100000 个元素的 StackOverflowError 但 mergesort 在 Java 中没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47796296/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com