Опорным берём последний элемент отрезка. Идём по отрезку слева направо и держим одну границу i – позицию, по которую уже собраны все маленькие элементы.
- Встретили элемент меньше опорного – граница сдвигается вправо, и найденный элемент меняется местами с тем, кто стоял на этой позиции.
- Встретили элемент больше опорного – ничего не делаем, он и так остаётся в правой части.
В конце опорный меняют с первым элементом справа от границы – и он оказывается между группами. На списке [5, 1, 4, 2, 8, 3] с опорным 3 это выглядит так.
| Смотрим | Сравнение | Что делаем | Список |
|---|---|---|---|
| 5 | 5 > 3 | ничего | 5 1 4 2 8 3 |
| 1 | 1 < 3 | граница на позицию 0, меняем 5 и 1 | 1 5 4 2 8 3 |
| 4 | 4 > 3 | ничего | 1 5 4 2 8 3 |
| 2 | 2 < 3 | граница на позицию 1, меняем 5 и 2 | 1 2 4 5 8 3 |
| 8 | 8 > 3 | ничего | 1 2 4 5 8 3 |
| – | – | меняем 4 и 3 | 1 2 3 5 8 4 |
Тройка на окончательном месте, слева от неё 1 2, справа 5 8 4.
Разбиение отрезка длины m стоит m − 1 сравнений: один проход, каждый элемент сравнивается с опорным один раз.