Подтвердить что ты не робот

Quicksort - причина для проверки равенства

Многие примеры в Интернете о Quicksort (на Java) близки к этому:

private void quicksort(int low, int high) {
    int i = low, j = high;
    int pivot = numbers[low + (high-low)/2];

    while (i <= j) {

      while (numbers[i] < pivot) {
        i++;
      }

      while (numbers[j] > pivot) {
        j--;
      }

      if (i <= j) {
        exchange(i, j);
        i++;
        j--;
      }
    }

    if (low < j)
      quicksort(low, j);
    if (i < high)
      quicksort(i, high);
}

То, о чем я озадачился, - это то, что есть те равенства:

1) while (i <= j) вместо while (i < j)

2) if (i <= j) вместо if (i < j)

Существуют ли какие-либо граничные случаи, когда это равносильно? Из моего понимания, если бы мы имели if(i == j), тогда мы бы в основном обменивали одно и то же значение с тем же значением.

Кто-нибудь может решить эту загадку для меня?

4b9b3361

Ответ 1

Предположим, что условие заменено на i < j.

Давайте посмотрим, что произойдет для такого массива, как:

5,4,3,2,1

Цикл while завершится с i = 2 и j = 2, а у нас будут перекрывающиеся вызовы функции quicksort, и эти вызовы будут:

quicksort(0,2) and quicksort(2,4)

тогда как если бы у нас было это условие i<=j, цикл завершился бы с i = 4 и j = 1, и теперь мы имели бы вызовы как:

quicksort(0,1) and quicksort(3,4)

которые являются правильными вызовами.

Итак, в принципе вы правы, нет смысла обменивать одни и те же элементы, но автор кода должен был исключить его, чтобы избежать необходимости добавления дополнительного условия, которое вам не нужно менять, когда я равно j