Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的快速排序递归_Python_Algorithm_Quicksort - Fatal编程技术网

Python中的快速排序递归

Python中的快速排序递归,python,algorithm,quicksort,Python,Algorithm,Quicksort,我一直在研究下面的快速排序算法,但无法理解为什么需要在括号中返回[pivot],以及为什么需要返回它。函数的输出是否只需要在现有函数中运行新的数组(越来越少),然后像第一次调用它时那样获取pivot值 def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr.pop() greater = [] less = [] for i in arr

我一直在研究下面的快速排序算法,但无法理解为什么需要在括号中返回[pivot],以及为什么需要返回它。函数的输出是否只需要在现有函数中运行新的数组(越来越少),然后像第一次调用它时那样获取pivot值

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    else:
        pivot = arr.pop()

    greater = []
    less = []
    for i in arr:
        if i > pivot:
            greater.append(i)
        else:
            less.append(i)
    return quick_sort(less) + [pivot] + quick_sort(greater)

arr1 = [7,8,9,6,5,4,7,8,9]

quick_sort(arr1)

def快速排序(arr):
如果透镜(arr)轴:
更大。附加(i)
其他:
减.追加(i)
返回快速排序(较小)+[pivot]+快速排序(较大)
arr1=[7,8,9,6,5,4,7,8,9]
快速分拣(arr1)

为什么需要在括号中返回pivot?

它们正在执行列表连接。考虑以下事项:

a = [1,2,3]
b = [4,5,6]
然后
a+b=[1,2,3,4,5,6]
。但是如果
b
只有一个元素(比如说,7),该怎么办?然后我们必须有
b=[7]
,以便
a+b
执行列表连接。如果我们说
b=7
是一个整数,那么操作
a+b
(列表加整数)就没有定义


为什么需要返回pivot?

快速排序的思想是围绕一个轴进行排序,这样,小于轴的所有元素都位于左侧,大于轴的所有元素都位于右侧

让list
a
为小于轴心
p
的所有元素,list
b
为大于轴心
p的所有元素

然后,我们必须返回所有元素的列表串联(小于(
a
),然后是枢轴,然后是所有元素的串联(大于(
b


这相当于
a+c+b
,其中
c=[p]
,或者更简而言之,
a+[p]+b
,正如您在代码中所写的那样。

解决方案试图将三个数组合并为一个数组。例如:

mergedArr=[1,2,3]+[4]+[5,6,7]
打印(合并)#[1,2,3,4,5,6,7]


将pivot包装在括号内只会显式地将其转换为列表,以便python程序可以将所有内容附加在一起

,因为您正在将列表合并为一个列表。这是否回答了您的问题@Sayse但是为什么首先需要返回pivot值呢?我不知道你在问什么,你需要它,否则每次调用函数时都会从列表中丢失一个元素pop()会从列表中删除一个元素,所以你必须显式地将它放回返回的列表中,否则每次递归都会丢失一个项目。