我在为Quicksort算法的某些实现定义和证明循环不变式时遇到麻烦。这既不是Lomuto也不是Hoare的分区版本。
如果您知道以这种方式实现的某些已知版本的Quicksort,请告诉我。
算法在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
我设法定义了以下循环不变式(可能不正确):
在
while
循环的每次迭代开始时,对于数组k
中的每个索引A
:
如果
k = p
,那么A[k] = y
如果
p < k <= i
,那么A[k] < y
如果
j <= k <= r
,那么A[k] > y
请帮助我为while
方法中的partition()
循环定义一个循环不变式(如果以上内容不正确),并证明这一点。
答案 0 :(得分:0)
外部 while 的不变量表示,在到目前为止已扫描的数组部分中,即范围<tr>
<td><input type="button" value="p"></td>
<td><input type="button" value="c"></td>
<td><input type="button" value="/c"></td>
<td><input type="button" value="s"></td>
<td><input type="button" value="/s"></td>
<td><input type="button" value="l"></td>
<td><input type="button" value="u"></td>
<td><input type="button" value="t"></td>
<td><input type="button" value="tr"></td>
<td><img id="glyphImage" src="si-glyph-image.svg"></td>
</tr>
和A[p..i]
中,左元素为不大于枢轴,右元素不小于。 (当然, A 的内容是初始内容的排列。)
退出循环时,所有左侧元素都不大于所有右侧元素,因此A[j..r]
被分区。