我必须用我选择的语言为作业实现 QuickSort 算法,我选择了 Python。
在讲座中,我们被告知 QuickSort 是内存高效的,因为它可以就地工作。即,它没有用于递归的输入数组部分的额外副本。
考虑到这一点,我尝试在 Python 中实现 QuickSort 算法,但不久之后意识到,为了编写一段优雅的代码,我必须在递归时将数组的一部分传递给函数本身。由于每次执行此操作时 Python 都会创建新列表,因此我尝试使用 Python3(因为它支持 nonlocal 关键字)。以下是我的注释代码。
def quicksort2(array):
# Create a local copy of array.
arr = array
def sort(start, end):
# Base case condition
if not start < end:
return
# Make it known to the inner function that we will work on arr
# from the outer definition
nonlocal arr
i = start + 1
j = start + 1
# Choosing the pivot as the first element of the working part
# part of arr
pivot = arr[start]
# Start partitioning
while j <= end:
if arr[j] < pivot:
temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
i += 1
j += 1
temp = arr[start]
arr[start] = arr[i - 1]
arr[i - 1] = temp
# End partitioning
# Finally recurse on both partitions
sort(start + 0, i - 2)
sort(i, end)
sort(0, len(array) - 1)
现在,我不确定我是否做得很好,或者我错过了什么。我已经编写了一个更加 Pythonic 的 QuickSort 版本,但这肯定不能就地工作,因为它会不断返回输入数组的一部分并将它们连接起来。
我的问题是,这是用 Python 做的吗?我已经搜索了 Google 和 SO,但还没有找到真正的 QuickSort 就地实现,所以我认为最好问问。