繁体   English   中英

如何摆脱Quicksort实现中的stackoverflows?

[英]How to get rid off the stackoverflows in my quicksort implementation?

大家!

我在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方法末尾的两个递归方法调用处的行上的stackoverflow。

奇怪的是,当我想对几个元素进行排序时,实现工作正常。 当我想对例如1000个元素进行排序时,此实现的问题开始出现,然后发生StackOverflowExceptions,并且第58行和第60行的错误在终端中重复了很多次。

在这里我会提供一些帮助,我将不胜感激:)

提前致谢!

/糊涂的家伙

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

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

last - first < 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM