OutOfMemoryError в реализации быстрой сортировки в Java - PullRequest
3 голосов
/ 24 ноября 2010

Я пытаюсь реализовать алгоритм быстрой сортировки, я прочитал, как это сделать с псевдокодом, и, поскольку я изучаю Java (потому что я уже провел быструю сортировку несколько месяцев назад в C ++), я хочу внедрить его в такиеязык, но я получаю проблемы переполнения стека или пространства кучи всякий раз, когда я пытаюсь запустить его, не могли бы вы проверить мой код?: D

    public static int[] quicksort(int arreglo[]){
    int size=arreglo.length;
    int pivote=arreglo[size/2];
    int menor[] = new int[size+2]; //If I leave the +2 I get stack overflow
    int mayor[] = new int[size+2]; //If I delete them I get heap space problems
    int j=0,k=0;
    if(size>2){
        for(int i=0;i<size;i++){
            if(arreglo[i]<=pivote){
                menor[j]=arreglo[i];
                j++;
            }
            else{
                mayor[k]=arreglo[i];
                k++;
            }
        }
        if(menor.length>=1&&mayor.length>=1)
            return concatena(Ordena.quicksort(menor),Ordena.quicksort(mayor),j,k);
        else
            if(menor.length>mayor.length)
                return menor;
            else
                return mayor;
    }
    else
        return arreglo;
}

public static int[] concatena(int menor[],int mayor[],int limite1,int limite2){
    int completo[] = new int[limite1+limite2];
    System.arraycopy(menor,0,completo,0,limite1);
    System.arraycopy(mayor,0,completo,limite1,limite2);
    return completo;
}

Спасибо за все ваши комментарии и ответы, я внес предложенные изменения, вставлю точное исключение:

Исключение в теме "главная" java.lang.OutOfMemoryError: пространство кучи Java в Ordena.quicksort (Ordena.java:6) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21)в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ордена).java: 21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (илиdena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21)в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ordena.java:21) в Ordena.quicksort (Ордена).java: 21) в Ordena.quicksort (Ordena.java:21)

А вот модифицированный код (я перевел свои переменные, извините, я не заметил):

    public static int[] quicksort(int array[]){
    int size=array.length;
    int pivot=array[size/2];
    int less[] = new int[size+2];
    int greater[] = new int[size+2];
    int j=0,k=0;
    if(size>2){
        for(int i=0;i<size;i++){
            if(array[i]<=pivot){
                less[j]=array[i];
                j++;
            }
            else{
                greater[k]=array[i];
                k++;
            }
        }
        less[j]=pivot;
        if(j>=1&&j>=1)
            return concatenate(Ordena.quicksort(less),Ordena.quicksort(greater),j,k);
        else
            if(j>k)
                return less;
            else
                return greater;
    }
    else
        return array;
}

public static int[] concatenate(int less[],int greater[],int limit1,int limit2){
    int complete[] = new int[limit1+limit2];
    System.arraycopy(less,0,complete,0,limit1);
    System.arraycopy(greater,0,complete,limit1,limit2);
    return complete;
}

1 Ответ

3 голосов
/ 24 ноября 2010

Основная проблема проистекает из этой строки:

if(menor.length>=1&&mayor.length>=1)

, которая должна быть

if(j>=1&&k>=1)

Почему?Ну, первое утверждение всегда верно, и когда все элементы, которые разделены, равны или меньше, чем сводная, все они будут в мэре в том же порядке, в котором они вошли. Быстрая сортировка вызывается снова в функциикоторый делает то же самое разбиение, и вы получите бесконечный цикл.В зависимости от того, насколько велики вы составляете массивы мэров или мэров, программа выдает ошибку из-за переполнения стека или из-за ошибки памяти.

Даже если вы измените вышеприведенную строку, сортировка не будет работать так, как у вас,Зачем?Ну, есть несколько причин.Во-первых, строка

if(menor.length>mayor.length)

должна быть

if(j>k)

Однако это только часть проблемы.Вы не будете продолжать сортировку мэра или менора, если они содержат все элементы, введенные в функцию.Однако, если вы отправите их на быструю сортировку, у вас все равно будет бесконечный цикл.Я бы порекомендовал отделить основную точку от остальной части массива, который вводится для быстрой сортировки (например, поменять местами с первым элементом) и разделить остальную часть массива.Затем поместите шарнир между разделенными массивами мэра и массивами меноров после того, как эти массивы были быстро отсортированы.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...