a[] = {2,3}
partition:
p = a[1] = 3
since a[lo] < p, lo += 1 = 1
since a[hi] == p, hi = 1
return hi = 1
_quicksort(a, lo, p) == _quicksort(a, 0, 1) (infinite recursion)
Переключение к возвращению lo, p-1, p, разрешает для pivot быть любой элемент, кроме [lo]:
a[] = {2,3}
partition:
p = a[1] = 3
since a[lo] < p, lo += 1 = 1
since a[hi] == p, hi = 1
return lo = 1
_quicksort(a, lo, p-1) == _quicksort(a, 0, 0) (ok)
_quicksort(a, p, hi) == _quicksort(a, 1, 1) (ok)
a[] = {3,3}
partition:
p = a[1] = 3
since a[lo] == p, lo = 0
since a[hi] == p, hi = 1
swap(a[lo], a[hi]) a = {3,3}
lo += 1 = 1
hi -= 1 = 0
since a[lo] == p, lo = 1
since a[hi] == p, hi = 0
return lo = 1
_quicksort(a, lo, p-1) == _quicksort(a, 0, 0) (ok)
_quicksort(a, p, hi) == _quicksort(a, 1, 1) (ok)
a[] = {4,3}
partition:
p = a[1] = 3
since a[lo] > p, lo = 0
since a[hi] == p, hi = 1
swap(a[lo], a[hi]) a = {3,4}
lo += 1 = 1
hi -= 1 = 0
since a[lo] > p, lo = 1
since a[hi] == p, hi = 0
return lo = 1
_quicksort(a, lo, p-1) == _quicksort(a, 0, 0) (ok)
_quicksort(a, p, hi) == _quicksort(a, 1, 1) (ok)
Lomuto с pivot = a [lo], в одной функции , После шага раздела он перезаписывается только на меньший раздел, затем обновляет lo или hi и возвращается назад для обработки большего раздела. Это ограничивает сложность стекового пространства O (log (n)), но сложность времени в наихудшем случае все еще составляет O (n ^ 2).
def quicksort(a, lo, hi):
while(lo < hi):
pivot = a[lo]
i = lo+1
for j in range(lo+1, hi+1):
if a[j] < pivot:
a[i],a[j] = a[j],a[i]
i += 1
i -= 1
a[i],a[lo] = a[lo],a[i]
if(i - lo <= hi - i):
quicksort(a, lo, i-1)
lo = i+1
else:
quicksort(a, i+1, hi)
hi = i-1