Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在algoritimo quicksort中修复此错误_Java_Sorting_Quicksort - Fatal编程技术网

Java 如何在algoritimo quicksort中修复此错误

Java 如何在algoritimo quicksort中修复此错误,java,sorting,quicksort,Java,Sorting,Quicksort,我一直在做一个程序,我需要对单词排序,一个数组字符串。我正在使用快速排序算法,当我第一次排序时,它工作得很好。但是,当我尝试对已排序的self数组进行排序时,它会抛出一个错误java.lang.StackOverflowerError 这是算法 protected String[] ordenar(String[] array) { return executeQuickSort(array, 0, array.length - 1); } private Str

我一直在做一个程序,我需要对单词排序,一个数组字符串。我正在使用快速排序算法,当我第一次排序时,它工作得很好。但是,当我尝试对已排序的self数组进行排序时,它会抛出一个错误java.lang.StackOverflowerError

这是算法

protected String[] ordenar(String[] array) {
       return executeQuickSort(array, 0, array.length - 1);
    }

    private String[] executeQuickSort(String[] array, int inicio, int fim){
        if(inicio < fim)
        {
            int posicaoPivo = partition(array, inicio, fim);
            if (posicaoPivo == fim) {
                posicaoPivo--;
            }
            executeQuickSort(array, inicio, posicaoPivo);
            executeQuickSort(array, posicaoPivo + 1, fim); 
        }
        return array;
    }

    private int partition(String[] array, int inicio, int fim) {
        String pivo = array[inicio];
        int i = inicio - 1 ;
        int j = fim + 1 ;

        while (true) 
        {
            i++;
            while ( i < fim && array[i].compareTo(pivo) < 0)
                i++;
                j--;
            while (j > inicio && array[j].compareTo(pivo) > 0)
                j--;

            if (i < j)
                swap(array, i, j);
            else
                return j;
        }
    }
    private void swap(String[] array, int i, int j) {
        String temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
受保护的字符串[]或字符串(字符串[]数组){
返回executeQuickSort(数组,0,array.length-1);
}
私有字符串[]executeQuickSort(字符串[]数组、int-inicio、int-fim){
如果(inicio<职能指令手册)
{
int posicaoPivo=分区(数组、inicio、fim);
如果(posicaoPivo==职能指令手册){
波西科皮沃--;
}
executeQuickSort(数组、inicio、posicaoPivo);
executeQuickSort(数组,posicaoPivo+1,fim);
}
返回数组;
}
私有int分区(字符串[]数组、int-inicio、int-fim){
字符串pivo=数组[inicio];
int i=inicio-1;
int j=职能指令手册+1;
while(true)
{
i++;
while(iinicio&&array[j].compareTo(pivo)>0)
j--;
if(i

我发现类似mvjava的东西正在使用大内存,然后抛出了一个错误。有人说我需要增加这个过程的内存,但在代码行中我还有其他选择吗?如果我做了这些更改,它是否能在我运行该程序的所有pc中工作?

您的分区方法需要改进。您可以使用while(pointL
private int分区(int left,int right,String[]数组){
int pointL=左-1;
int pointR=右;
字符串[]a=数组;
//通常,轴被选为中间元素。。
//如果pivot是阵列性能的中位数,则性能将变高
字符串轴=a[左+(左+右)/2];
while(pointL0&&a[-pointR].compareTo(pivot)>0);
if(pointL>=pointR){
打破
}否则{
a=交换(点L、点R、a);
}
}
a=交换(点L,右,a);
返回点L;
}
公共字符串[]交换(int-pointL、int-pointR、字符串[]a){
字符串tmp=a[pointL];
a[pointL]=a[pointR];
a[pointR]=tmp;
返回a;
}

您的分区看起来很奇怪,请尝试此分区

private int partition(String[] array, int inicio, int fim) {
    String pivo = array[(inicio + fim) / 2];
    int i = inicio;
    int j = fim;

    while (true) {
        while (array[i].compareTo(pivo) < 0) {
            i++;
        }
        while (array[j].compareTo(pivo) > 0) {
            j--;
        }

        if (i < j) {
            swap(array, i, j);
            i++;
            j--;
        } else {
            return i;
        }
    }
}
private int partition(字符串[]数组、int-inicio、int-fim){
字符串pivo=数组[(inicio+fim)/2];
int i=inicio;
int j=职能指令手册;
while(true){
while(数组[i]。比较(pivo)<0){
i++;
}
while(数组[j]。比较(pivo)>0){
j--;
}
if(i
请在SOE中添加运行的测试用例。不要发布包含bug的代码。
private int partition(String[] array, int inicio, int fim) {
    String pivo = array[(inicio + fim) / 2];
    int i = inicio;
    int j = fim;

    while (true) {
        while (array[i].compareTo(pivo) < 0) {
            i++;
        }
        while (array[j].compareTo(pivo) > 0) {
            j--;
        }

        if (i < j) {
            swap(array, i, j);
            i++;
            j--;
        } else {
            return i;
        }
    }
}