Member 11018842 Ответов: 1

Алгоритм сортировки слиянием в java


- Привет!

Я хочу отсортировать массив с помощью алгоритма сортировки слиянием. Я написал треску, кажется, все в порядке в моем коде, но полученный массив не отсортирован должным образом. Я собираюсь поставить ниже свой код. В результате массив
[2, 55, 22, 22, 44, 66, 33, 77]


Заранее спасибо.

Что я уже пробовал:

import java.util.Arrays;

/*
Write a function that sorts an array of numbers using merge sort.
 */
public class BonusExtraExercise11 {
    public static void main(String[] args) {
        int[] unsortedArray = {2, 55, 44, 22, 77,66,33,22};
        String sortedArray = Arrays.toString(DivideArray(unsortedArray));
        System.out.println(sortedArray);


    }

    public static int [] DivideArray(int[] unsortedArray) {
        // We create two sub-arrays. We give them the value 0. It is going to be changed when we find out if the array
        // is even or odd.
        if(unsortedArray.length == 1)
        {
            return unsortedArray; //Array is a single element.
        }
        int [] leftSide = new int[0];
        int [] rightSide = new int[0];
        int [] sortedArray;
        // We find out if the array is even or odd..
        int middle = unsortedArray.length / 2;
        int remainder = unsortedArray.length % 2;
        // If the array is even the length of the sub-arrays will get the value of the variable "middle".
        if(remainder == 0){
           leftSide = new int[middle];
           rightSide = new int[middle];
        }
        //If the array is odd than the array leftSide will get the length of the variable middle
        //and the rightSide is going to get the value of the variable middle +1.

        if(remainder == 1)
        {
            leftSide = new int[middle];
            rightSide = new int[middle+1];
        }
        //populate leftside
        for(int i=0; i<leftSide.length; i++)
        {
        leftSide[i] = unsortedArray[i];

        }
        //populate right side
        int n=0;
        for(int j=middle; j<unsortedArray.length; j++) {
            rightSide[n] = unsortedArray[j];
            n++;
        }
        leftSide = DivideArray(leftSide);
        rightSide = DivideArray(rightSide);
        sortedArray=Merge(leftSide, rightSide);
        return sortedArray;
    }
    public static int [] Merge(int [] leftSide, int [] rightSide)
    {
        int lengthSortedArray = leftSide.length+rightSide.length;
        int [] sortedArray = new int[lengthSortedArray];
        int indexL = 0;
        int indexR = 0;
        int indexSortArr = 0;
        while(indexL<leftSide.length || indexR<rightSide.length)
        {
            if(indexL<leftSide.length && indexR<rightSide.length)
            {
                if(leftSide[indexL]<=rightSide[indexR])
                {
                    sortedArray[indexSortArr++] = leftSide[indexL++];
                }
                else
                {
                    sortedArray[indexSortArr++] = rightSide[indexR++];
                }
            }
            if(indexL<leftSide.length)
            {
                sortedArray[indexSortArr++] = leftSide[indexL++];
            }
            if(indexR<rightSide.length)
            {
                sortedArray[indexSortArr++] = rightSide[indexR++];
            }
        }
        return sortedArray;
    }

}

1 Ответов

Рейтинг:
4

Patrice T

Цитата:
Я написал треску, кажется, все в порядке в моем коде, но полученный массив не отсортирован должным образом.

Поскольку результат неверен, в вашем коде не все в порядке.
Программа похожа на английский язык, там больше, чем один уровень корректности.
Пример: кошка летит высоко в небе.
- Слова английские: правильные
- Предложение является синтаксически хорошим английским языком: правильно
- Это предложение не имеет смысла, потому что кошки не летают: Не правильный
Тот факт, что программа компилируется нормально, не означает, что она будет выполнять свою работу так, как ожидалось.
Используйте отладчик, чтобы наблюдать за выполнением кода, шаг за шагом и проверять переменные. Отладчик-это инструмент выбора для поиска ошибок.
-----
Ваш код ведет себя не так, как вы ожидаете, и вы не понимаете, почему !
Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что вы должны делать, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.
Отладчик - Википедия, свободная энциклопедия[^]
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.

[Обновление]
Цитата:
Я полагаю, что проблема заключается в том, что алгоритм не сортирует эти два массива.

Не предполагайте, используйте отладчик, чтобы убедиться.
Ваш код очень сложный
int [] leftSide = new int[0];
int [] rightSide = new int[0];
int [] sortedArray;
// We find out if the array is even or odd..
int middle = unsortedArray.length / 2;
int remainder = unsortedArray.length % 2;
// If the array is even the length of the sub-arrays will get the value of the variable "middle".
if(remainder == 0){
   leftSide = new int[middle];
   rightSide = new int[middle];
}
//If the array is odd than the array leftSide will get the length of the variable middle
//and the rightSide is going to get the value of the variable middle +1.

if(remainder == 1)
{
    leftSide = new int[middle];
    rightSide = new int[middle+1];
}

может быть упрощен до
int [] sortedArray;
// We find out if the array is even or odd..
int middle = unsortedArray.length / 2;
int [] leftSide = new int[middle];
int [] rightSide = new int[unsortedArray.length-middle];

[Обновление]
Я вижу твою ошибку
while(indexL<leftSide.length || indexR<rightSide.length)
{
    if(indexL<leftSide.length && indexR<rightSide.length)
    {
        if(leftSide[indexL]<=rightSide[indexR])
        {
            sortedArray[indexSortArr++] = leftSide[indexL++];
        }
        else
        {
            sortedArray[indexSortArr++] = rightSide[indexR++];
        }
    }
    else
    { // only when you reached the end of leftSide or rightSide
        if(indexL<leftSide.length)
        {
            sortedArray[indexSortArr++] = leftSide[indexL++];
        }
        if(indexR<rightSide.length)
        {
            sortedArray[indexSortArr++] = rightSide[indexR++];
        }
    }
}


Member 11018842

Спасибо за ваш ответ.

Я пытался выяснить в течение многих часов, где проблема, и я не мог выяснить. Я полагаю, что проблема заключается в том, что алгоритм не сортирует эти два массива. (слева и справа). Но я не могу это исправить.

В любом случае, еще раз спасибо за ваш ответ.

Member 11018842

Большое спасибо. Я боролся весь день напролет, чтобы выяснить, в чем проблема. С тех пор, как я начал изучать программирование, прошло всего 2 недели. Вот почему иногда даже с отладчиком мне трудно найти проблему.

Спасибо еще раз.