I'm having trouble defining and proving a loop invariant for some implementation of Quicksort algorithm. This is neither Lomuto's nor Hoare's partition version.
If you know about some known version of Quicksort that is implemented this way, let me know, please.
Algorithm's implementation in Python:
def partition(arr: list, p: int, r: int):
y = arr[p]
i = p
j = r + 1
while i < j:
i = i + 1
while i <= r and A[i] < y:
i = i + 1
j = j - 1
while j >= p and A[j] > y:
j = j - 1
if i <= j:
swap(arr, i, j)
swap(arr, j, p)
return j
def quicksort(arr: list, p: int, r: int):
if p < r:
q = partition(arr, p, r)
quicksort(arr, p, q - 1)
quicksort(arr, q + 1, r)
def swap(arr: list, i, j):
tmp = arr[i]
arr[i] = arr[j]
arr[j] = tmp
I have managed to define the following loop invariant (it might be incorrect):
At the beginning of each iteration of the
while
loop, for each indexk
in arrayA
:
if
k = p
, soA[k] = y
if
p < k <= i
, soA[k] < y
if
j <= k <= r
, soA[k] > y
Please help me to define a loop invariant for the while
loop in partition()
method (if the above is incorrect), and prove it.