Python'指针算术' - Quicksort

时间:2014-06-18 03:49:47

标签: python c arrays list pointers

在惯用的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个索引)在两种情况下都是相同的。

2 个答案:

答案 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):

然后创建和连接切片将工作正常,而不需要类似指针的功能。