Понимание алгоритма сортировки вставкой

#java #insertion-sort

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

Вопрос:

Я изучаю механику кода вставки. Это оригинальный алгоритм вставки кода, описанный на нескольких сайтах:

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

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

    a[j] = key;
}
  

Проблема в том, что, изучая, как это работает, я понял, что следующий код без использования ключа делает точно то же самое:

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

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

Мой вопрос в том, почему в исходном алгоритме требуется их ключ? необходимо ли это для некоторых крайних случаев, которые второй алгоритм не учитывает? Если да, то в каких крайних случаях они будут?
После некоторого тестирования результаты обоих алгоритмов выполняют одинаковое количество обменов, поэтому я не могу понять, в чем разница в использовании ключевой переменной.

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

1. Это не требуется. Семантически оба алгоритма одинаковы. key Это » текущее значение под наблюдением «, если вы так хотите ( a[j] в измененной версии). Основное отличие заключается в том, что исходный код извлекает значение только один раз, в то время как обновленная версия извлекает его снова и снова.

2. Разве второе решение не больше похоже на сортировку пузырьками, но в обратном направлении?

3. На ваш вопрос дан ответ?