我知道在Python中,通过给出对象引用的副本来传递变量。但我不明白为什么在我写的下面一段代码中,函数Partition
不会改变arr
的元素。
def Partition(arr, lo, hi):
pivot = arr[lo]
i = lo
j = hi
while(True):
while(arr[i] < pivot):
i += 1
if i == hi: break
while(arr[j] > pivot):
j -= 1
if j == lo: break
if i >= j : break #check if ptrs cross
arr[i], arr[j] = arr[j], arr[i]
#swap lo and j
arr[lo], arr[j] = arr[j], arr[lo]
return j
def Sort(arr, start, end):
if (end <= start): return
right = Partition(arr, start, end)
Sort(arr, start, right-1)
Sort(arr, right+1, end)
答案 0 :(得分:0)
这似乎是一个错误:
Assume arr = [1,3,4,7,5,8], lo=3, hi=6
def Partition(arr, lo, hi):
pivot = arr[lo] <- this is arr[3] = 7
i = lo <- i = 3
j = hi
while(True):
while(arr[i] < pivot): <- arr[3] = 7 so condition fails hence no swap
答案 1 :(得分:0)
您的Partition
函数存在逻辑问题。
如果您使用调试器跟随它,您将看到它总是在返回之前将数组恢复到其初始状态。该数组实际上会被视为已修改,问题是在摆弄它一段时间后,它会回到进入函数时的确切状态。
您使用调试工具吗?如果没有,请立即开始这样做。
如果是这样,在return j
语句上放置一个断点,并检查数组,你会看到我的意思。
您正在尝试实施 Hoare 分区,对吧? 我觉得你有些混乱了。问题是因为您在第一次循环迭代之前与枢轴进行比较,最终会比较刚刚重新交换的元素。