Рекурсивная сортировка выбора (Java Eclipse Neon 2) - PullRequest
0 голосов
/ 04 октября 2018

Хорошо, хорошо.Я работал над рекурсивной сортировкой выбора в Java.Я сделал чтение, поиск в Google, переполнение стека, и все еще не могу понять это.Я думаю, что код ухудшается, чем больше времени я трачу на него из-за его чрезмерного усложнения.Все примеры, которые я видел, используют несколько параметров, и один параметр отбрасывает меня.

Ниже приведен рекурсивный метод и драйвер.Первые 3, если утверждения даны, поэтому я предполагаю, что требуется.

public static void selectionSort_Rec(int[] arr)
 {
    if(arr == null) throw new NullPointerException();
    if(arr.length == 0) throw new IllegalArgumentException();
    if(arr.length == 1) return;

    int startIndex = 0;


    if ( startIndex >= arr.length - 1 )
        return;

    int minIndex = startIndex;

    for ( int index = startIndex + 1; index < arr.length; index++ )
    {
        if (arr[index] < arr[minIndex] )
            minIndex = index;
        }
    int temp = arr[startIndex];
    arr[startIndex] = arr[minIndex];
    arr[minIndex] = temp;

    startIndex++;
    selectionSort_Rec(arr);
    }

// Driver method 
public static void main(String args[])  
{ 
    int arr[] = {3, 1, 5, 2, 7, 0}; 

    // Calling function 
    selectionSort_Rec(arr);
    for(int i :arr){
        System.out.print(i);
    }
} 

1 Ответ

0 голосов
/ 04 октября 2018

В вашем коде есть какая-то проблема.
при первом использовании startIndex и для этого найдите в своем массиве хорошее число, затем увеличьте его в конце кода, что является избыточным, поскольку при повторном вызове функции оноиспользуйте 0 для этого снова.каждый вызов функции имеет свою собственную переменную, поэтому при следующем вызове функции создайте новый startIndex и снова используйте значение, равное нулю.
Вы должны передавать его функции и увеличивать при каждом следующем вызове функции.из-за этого ваша базовая проверка больше не является истинной, и она заменяется проверкой до тех пор, пока мы не получим в конце нашего массива.
также эта строка кода избыточна, потому что, когда мы добираемся до этой строки, мы знаем, что arr.lenghth() больше чем один(однако наша логика кода изменилась, и в этом также нет необходимости)

if ( startIndex >= arr.length - 1 )
    return;

возвращать, когда базовое условие, например, 1, лучше и исключение throw не требуется, поскольку, когда оно равно единице, мы возвращаемся безидти ниже.(условия всегда ложны для нулевого или пустого массива. Вы тоже ничего не удаляете из массива)
Я определяю рекурсивную функцию как функцию, которая сортирует массив из отправленного ему начального индекса.
Это результат:

public class GFG
{
    public static void selectionSort_Rec(int[] arr) {
        selectionSortHelper(arr, 0);
    }

    static void selectionSortHelper(int[] arr, int startIndex) {
        if (startIndex >= arr.length)
            return;

        int minIndex = startIndex;

        for (int index = startIndex + 1; index < arr.length; index++)
        {
            if (arr[index] < arr[minIndex])
                minIndex = index;
        }
        int temp = arr[startIndex];
        arr[startIndex] = arr[minIndex];
        arr[minIndex] = temp;

        selectionSortHelper(arr, startIndex + 1);
    }

    // Driver method
    public static void main(String args[]) {
        int arr[] = {3, 1, 5, 2, 7, 0};

        // Calling function
        selectionSort_Rec(arr);
        for (int i : arr)
        {
            System.out.print(i + " ");
        }
    }
}

Надеюсь, это то, что вы хотите.

...