gpt4 book ai didi

java - 如何消除快速排序实现中的堆栈溢出?

转载 作者:行者123 更新时间:2023-12-01 11:51:59 26 4
gpt4 key购买 nike

大家!

我在 Java 中的快速排序实现遇到了一些 stackoverflow 问题,对于快速排序的每个递归调用都使用随机化的主元元素,如下面的代码所示。我的问题是我的代码中的三个(!)地方出现了 stackoverflow:

import java.util.Random;

/**
* Write a description of class QuickSort1 here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class QuickSort1 implements IntSorter
{
private int[] v;
private Random randomGenerator;

public QuickSort1()
{
randomGenerator = new Random();
}

public void sort(int[] v)
{
this.v = v;
if(this.v.length > 0) {
quickSort(this.v, 0, this.v.length-1);
}
else {
return;
}
}

private void quickSort(int[] v, int first, int last)
{
if(v.length < 2)
return;
else {
int First = first;
int Last = last;
int pivot = v[randomGenerator.nextInt(v.length)];

while(First <= Last) {
while(v[First] < pivot) {
First++;
}
while(v[Last] > pivot) {
Last--;
if(Last==0)
break;
}
if(First<=Last) {
int temp = v[First];
v[First] = v[Last];
v[Last] = temp;
First++;
Last--;
}
}

if(first < Last)
quickSort(v, first, Last);
if(First < last)
quickSort(v, First, last);
}
}
}

调用 sort(int[] v) 时收到的错误消息如下:

java.lang.StackOverflowError
at java.util.Random.nextInt(Random.java:307)
at QuickSort1.quickSort(QuickSort1.java:37)
at QuickSort1.quickSort(QuickSort1.java:60)
at QuickSort1.quickSort(QuickSort1.java:58)

这些消息指示当随机生成器在 0(含)和 v.length(不包括)范围内确定枢轴元素时以及在 QuickSort 方法末尾的两个递归方法调用时发生堆栈溢出。

奇怪的是,当我想对一些元素进行排序时,实现效果很好。当我想要对 1000 个元素进行排序时,此实现的问题就开始出现,然后出现 StackOverflowException,并且第 58 行和第 60 行的错误在终端中重复很多次。

如果您能在这里得到一些帮助,我将非常感激:)

提前致谢!

/困惑的家伙

最佳答案

if(first < Last)
quickSort(v, first, Last);
if(First < last)
quickSort(v, First, last);

v 是完整的数组。它永远不会达到小于 2 的长度。要么对 v 进行分区,要么将基本情况条件调整为

last - first < 2

关于java - 如何消除快速排序实现中的堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28727036/

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