Моя логика сортировки вставки кажется правильной, но не работает

#java #sorting #insertion-sort

#java #сортировка #вставка-сортировка

Вопрос:

Я пытаюсь реализовать сортировку по вставке.

 public int[] insertionSort(int[] a) {

    for(int i=0; i<a.length;i  ) {
        int j=i 1;

        while(a[j] < a[i] amp;amp; j < a.length) {
            swap(a[j],a[i]);
            j--;
            i--;
        }
    }
    return a;
}

public void swap(int a, int b) {
    int temp;
    temp = a;
    a = b;
    b = temp;
}
  

Не является ли это — технически — тем же самым (с точки зрения выходного результата), как если бы я должен был сказать j = i-1 и заменить условие в цикле while из j < a.length на j > = 0?

Комментарии:

1. Каким образом не работает? Можете ли вы предоставить нам образец ввода / вывода, который работает не так, как вы ожидали?

2. Прошу прощения, ArrayIndexOutOfBounds. Дважды проверил и, похоже, не вижу с этим никаких проблем

Ответ №1:

Вы не можете поменять значения в другом методе таким образом, поскольку параметры передают значения, а не ссылки на значения.

Вероятно, вам лучше просто не использовать отдельный метод для подкачки, подобный этому (также пришлось увеличивать вместо уменьшения значения i и j ):

 public int[] insertionSort(int[] a) {
    int temp;

    for(int i=0; i<a.length;i  ) {
        int j=i;

        while(j > 0 amp;amp; a[j-1] > a[j]) {
            temp = a[j];
            a[j] = a[j-1];
            a[j-1] = temp;
            j--;
        }
    }
    return a;
}
  

Редактировать: пришлось обновить снова — условия в цикле while были в неправильном порядке, поэтому он будет искать следующий индекс массива, прежде чем проверять, достиг ли он конца массива.

Правка 2: как упоминалось в комментариях, я покажу, как написать swap метод, который действительно работает — вместо передачи значений вам придется передать весь массив и вернуть его после. Я бы все же, вероятно, рекомендовал сделать это описанным выше способом, но только в образовательных целях:

 public int[] insertionSort(int[] a) {

    for(int i=0; i<a.length;i  ) {
        int j=i;

        while(j > 0 amp;amp; a[j-1] > a[j]) {
            a = swap(a, j-1, j);
            j--;
        }
    }
    return a;
}


public int[] swap(int[] a, int index1, int index2) {
    int temp = a[index1];
    a[index1] = a[index2];
    a[index2] = temp;
    return a;
}
  

Правка 3: делал что-то глупое и не совсем задал сортировку вставки. Теперь все отсортировано (извините за каламбур).

Комментарии:

1. Код, скорее всего, все равно выдаст исключение ArrayIndexOutOfBoundsException из-за j- и i- though .

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

3. он мог бы просто передать массив и индексы методу

4. Вы запустили код? Я получаю исключение с массивом { 5, 1, 12, 15 }.

5. @SharkofMirkwood Всегда пожалуйста. Хороший каламбур 😉 PS ваш метод swap генерирует две ошибки.