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

标签 java quicksort stack-overflow

大家!

我在 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/

相关文章:

java - 线程中出现异常 "main"java.lang.StackOverflowError

java - 使用 jboss-as-7.1.1.Final 在 CentOS 6.6 上安装 ejbca_ce_6_1_1

c++ - 几个排序问题

c# - 递归调用 async-void : any guarantee on the stack limit?

c++ - "Not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation"

c - C 上的快速排序错误

java - 关于如何修复此堆栈溢出错误有什么建议吗? java

java - @Provides 和@Named 不适用于父类(super class)型声明的变量

java - 如何在没有上下文的android Holder类中使用Font Awesome?

java - 为什么在类路径规范中找不到 jar 文件? (来自 Oracle 的 FileChooserDemo)