Ключевым компонентом алгоритма является то, что выбранное значение сводки пришло из исходного списка, что означает (в вашем случае) элемент со значением 5
теперь в правильной конечной позиции после первого разбиения:
4 3 2 5 9 11 8 12 6 10 7
Это должно быть довольно очевидно и следует простой интуиции. Если каждый элемент слева от элемента меньше, чем этот элемент, а каждый элемент справа больше, то элемент должен быть в правильной, отсортированной позиции.
Понимание, необходимое для понимания всего алгоритма быстрой сортировки, заключается в том, что вы можете просто продолжать делать это для каждого из подсписков - списка значений слева от сводки и списка, содержащего все значения справа - чтобы получить в окончательном отсортированном списке. Это потому что:
- Каждое разбиение помещает еще один элемент в правильное положение
- Каждая итерация удаляет один элемент - сводку - из списка элементов, оставленных для обработки (поэтому в конечном итоге мы достигнем базового случая с нулевым (или одним, в зависимости от того, как вы это делаете) элементами)
Предположим, вы выбрали значение раздела 5
на основе следующего псевдокода:
Math.floor(list.length / 2)
Для наших целей фактический выбор точки разворота не имеет большого значения. Этот работает на ваш оригинальный выбор, поэтому мы пойдем с ним. Теперь давайте доиграем это до конца (начиная с того места, где вы остановились):
concat(qs([4 3 2]), 5, qs([9 11 8 12 6 10 7])) =
concat(qs([2]), 3, qs([4]), 5, qs([9, 11, 8, 6, 10, 7]), 12, qs([])) =
concat(2, 3, 4, 5, qs([6, 7]), 8, qs([9, 11, 10]), 12) =
concat(2, 3, 4, 5, qs([6]), 7, qs([]), 8, qs([9, 10]), 11, qs([]), 12) =
concat(2, 3, 4, 5, 6, 7, 8, qs([9]), 10, qs([]), 11, 12) =
concat(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
Обратите внимание, что каждый раз, когда вы видите один вызов qs
, он будет следовать следующей схеме:
qs(<some_left_list>), <the_pivot>, qs(<some_right_list>)
И каждый вызов qs
в одной строке приводит к еще двум таким вызовам в следующей строке (представляя обработку обоих новых подсписков (за исключением того, что я немедленно разбиваю вызовы на qs
в списках с одним значением)) .
Хорошая идея - пройти это упражнение самостоятельно. Да, с ручкой и бумагой.