Классика. Pivot — обычно середина. Возвращает индекс, где массив нужно "порезать".
Не гарантирует, что pivot окажется на своём месте!
def partition(arr, low, high):
pivot = arr[(low + high) // 2]
i = low - 1
j = high + 1
while True:
i += 1
while arr[i] < pivot:
i += 1
j -= 1
while arr[j] > pivot:
j -= 1
if i >= j:
return j
arr[i], arr[j] = arr[j], arr[i]
→ Не зависит от pivot, но работает чётко, если правильно делишь левую/правую часть в рекурсии
(quicksort(arr, low, p) и quicksort(arr, p + 1, high))