在惯用的C方式中,可以用两个参数以简单的方式实现快速排序:
void quicksort(int inputArray[], int numelems);
我们可以通过指针算法安全地使用两个参数进行后续细分(即分区,因为它们通常被称为):
//later on in our quicksort routine...
quicksort(inputArray+last+1, numelems-last-1);
事实上,我甚至在之前就问过这个问题,因为我当时没有接受过指针算术的训练:见Passing an array to a function with an odd format - “v+last+1”
基本上,是否有可能在python中复制相同的行为,如果是这样,怎么样?我注意到列表可以用方括号内的冒号(切片运算符)进行细分,但是切片运算符不会从该点开始传递列表;也就是说第一个元素(第0个索引)在两种情况下都是相同的。
答案 0 :(得分:3)
正如您所知,Python的切片语法会复制,因此为了操作列表的子部分(而不是“数组”,在Python中),您需要传递列表和开头 - 正在讨论的部分的索引和大小(或结束索引),就像在C中一样。递归函数的签名将类似于:
def quicksort( inputList, numElems, startIndex = 0 ):
递归调用类似于:
quicksort( inputList, numElems-last-1, last+1 )
在整个函数中,您将startIndex
添加到您将进行的任何列表访问中。
答案 1 :(得分:1)
我想如果您想做类似的事情,您可以执行以下操作:
# list we want to mutate
sort_list = [1,2,3,4,5,6,7,8,9,0]
#wrapper just so everything looks pretty, process could go here if we wanted
def wrapper(a, numlems):
cut = len(a) - numlems
# overwrites a part of the list with another one
a[cut:] = process(a[cut:])
# processing of the slice
def process(a):
# just to show it works
a[1] = 15
return a
wrapper(sort_list, 2)
print(sort_list)
wrapper(sort_list, 4)
print(sort_list)
wrapper(sort_list, 6)
print(sort_list)
这在python中可能被认为是非常邪恶的,我不会真的推荐它,但它确实模仿了你想要的功能。
对于python,你真的需要:
def quicksort(inputList, startIndex):
然后创建和连接切片将工作正常,而不需要类似指针的功能。