Понимание голландской программы национального флага

Я читал проблему голландского национального флага, но не мог понять, что low а также high аргументы в threeWayPartition функция в реализации C++.

Если я принимаю их как минимальные и максимальные элементы массива для сортировки, то if а также else if заявления не имеет никакого смысла, так как (data[i] < low) а также (data[i] > high) всегда возвращает ноль.

Где я не прав?

3 ответа

Решение

low а также high это значения, которые вы определили для трехстороннего разбиения, т.е. для трехстороннего разбиения вам нужны только два значения:

[bottom] <= low  < [middle] < high <= [top]

В программе на C++ вы перемещаете позиции, в которых произошли разбиения. Пошаговый пример:

data = [ 3, 1, 4, 9, 8, 2, 6, 9, 0 ]
low  = 4
high = 8

   [ 3 , 1 , 4 , 9 , 8 , 2 , 6 , 9 , 0 ]
p^  i^                                  q^

   [ 3 , 1 , 4 , 9 , 8 , 2 , 6 , 9 , 0 ]
    p^  i^                              q^

   [ 3 , 1 , 4 , 9 , 8 , 2 , 6 , 9 , 0 ]
        p^  i^                          q^

   [ 3 , 1 , 4 , 9 , 8 , 2 , 6 , 9 , 0 ]
        p^      i^                      q^

   [ 3 , 1 , 4 , 0 , 8 , 2 , 6 , 9 , 9 ]
        p^      i^                  q^

   [ 3 , 1 , 0 , 4 , 8 , 2 , 6 , 9 , 9 ]
            p^      i^              q^

   [ 3 , 1 , 0 , 4 , 9 , 2 , 6 , 8 , 9 ]
            p^      i^          q^

   [ 3 , 1 , 0 , 4 , 6 , 2 , 9 , 8 , 9 ]
            p^      i^      q^

   [ 3 , 1 , 0 , 4 , 6 , 2 , 9 , 8 , 9 ]
            p^          i^  q^

   [ 3 , 1 , 0 , 2 , 6 , 4 , 9 , 8 , 9 ]
                p^         iq^

Как говорит алгоритм:

  • Поменяйте местами элемент над дном (т.е. p + 1) потому что все ниже дна уже проверено, или
  • Поменяйте местами элемент под верхом (т.е. q - 1) потому что все выше вершины уже проверено, или
  • Оставьте элемент там, где он есть, потому что он принадлежит середине.

Ты получаешь [3, 1, 0, 2], [6, 4] а также [9, 8, 9] как нижний, средний и верхний разделы соответственно.

} else if (data[i] >= high) { показывает, что то, что вы, хотя и видели, может не соответствовать тому, что было написано в статье.

Думать о low а также high как полуоткрытый диапазон [low,high) для значений в среднем разделе. Все значения меньше чем low в конечном итоге в левом разделе. Средний раздел будет содержать значения из low до, но не включая, high, Наконец, все значения больше или равны high в конечном итоге в правильном разделе.

Другие вопросы по тегам