Python 这是快速排序还是合并排序?

Python 这是快速排序还是合并排序?,python,algorithm,sorting,quicksort,mergesort,Python,Algorithm,Sorting,Quicksort,Mergesort,以下是函数: def sort(unsorted): less = [] equal = [] greater = [] if len(unsorted) < 1: return unsorted pivot = unsorted[-1] for element in unsorted: if element < pivot: less.append(element)

以下是函数:

def sort(unsorted):
    less = []
    equal = []
    greater = []

    if len(unsorted) < 1:
        return unsorted

    pivot = unsorted[-1]

    for element in unsorted:
        if element < pivot:
            less.append(element)
        if element == pivot:
            equal.append(element)
        if element > pivot:
            greater.append(element)

    return sort(less)+equal+sort(greater)


unsorted = [7 ,2, 1, 8, 6, 3, 5, 4]
print sort(unsorted)
def排序(未排序):
减=[]
相等=[]
更大=[]
如果len(未排序)<1:
未分类返回
枢轴=未排序[-1]
对于未排序中的元素:
如果元素<枢轴:
减.追加(元素)
如果元素==枢轴:
equal.append(元素)
如果元素>轴:
更大。追加(元素)
返回排序(较小)+相等+排序(较大)
未排序=[7,2,1,8,6,3,5,4]
打印排序(未排序)
我很难将其定义为快速排序或合并排序。从概念上讲,我认为它符合快速排序的定义:它使用一个pivot将元素分成比pivot更小和更大的子集,然后递归地对它们进行排序。但另一方面,它让我想起了Merge-sort,因为它递归地将给定的列表分解成更小的块,然后将它们重新组合在一起(尽管是围绕“轴心”)


那么这是一种快速排序还是合并排序?

合并排序总是在len(list)/2的索引处分割列表。但由于此代码基于列表[-1]处的值划分arr,因此这是快速排序

合并排序始终在len(list)/2索引处划分列表。但是,由于此代码基于列表[-1]中的值对arr进行分割,因此这是一种快速排序。

合并排序不需要在分割前对整个数组进行比较。

合并排序不需要在分割前对整个数组进行比较。

快速排序分区,合并排序合并


显然有一个分区过程(一边是小键,另一边是大键),而且显然没有合并(两个排序的序列交织在一个序列中)。

快速排序分区,合并排序合并


显然有一个分区过程(一边是小键,另一边是大键),而且显然没有合并(两个排序的序列交织在一个序列中)。

这显然是一个快速排序实现,而不是合并排序。试想一下快速排序的工作原理:它在整个数组上拾取一个轴并重新排列,使轴值左侧的所有内容都小于轴值,右侧的所有内容都大于轴值。因此,给定数组
[7,2,1,8,6,3,5,4]
,轴值为4,则得到
[3,2,1,4,8,7,6,5]

接下来,它将子阵列划分到轴的左侧和右侧。让我们使用2作为左侧站点的轴,使用6作为右侧的轴。先做左边,我们得到
[1,2,3,4,8,7,6,5]
。然后对右侧进行递归分区,最后得到
[1,2,3,4,5,6,7,8]

快速排序是自上而下的。它划分整个阵列,然后是两个子阵列,并递归地划分每个子阵列,直到子阵列的长度为1

合并排序是自下而上的。它首先通过数组进行传递,“合并”相邻项。因此,在第一次传递之后,数组是
[2,7,1,8,3,6,4,5]
。接下来,它合并相邻的两个元素数组。第一次合并是子数组
[2,7,1,8]
,产生
[1,2,7,8]
。第二次合并是
[3,6,4,5]
,生成完整的数组
[1,2,7,8,3,4,5,6]

最后,它合并两个四元素子数组,生成排序后的数组

您的代码显然是自上而下工作的:它划分初始数组,然后递归地划分左、右子数组。不涉及合并,而是一个附加步骤,用于从已排序的分区重新组装子阵列


注意,人们有时会谈论“自上而下”或“自下而上”合并排序。如果算法是迭代或递归编写的,那么这就更重要了,而不是实际排序工作是如何完成的。无论采用何种实现方式,它总是从合并两个单元素子阵列(相邻项)开始。

这显然是一种快速排序实现,而不是合并排序。试想一下快速排序的工作原理:它在整个数组上拾取一个轴并重新排列,使轴值左侧的所有内容都小于轴值,右侧的所有内容都大于轴值。因此,给定数组
[7,2,1,8,6,3,5,4]
,轴值为4,则得到
[3,2,1,4,8,7,6,5]

接下来,它将子阵列划分到轴的左侧和右侧。让我们使用2作为左侧站点的轴,使用6作为右侧的轴。先做左边,我们得到
[1,2,3,4,8,7,6,5]
。然后对右侧进行递归分区,最后得到
[1,2,3,4,5,6,7,8]

快速排序是自上而下的。它划分整个阵列,然后是两个子阵列,并递归地划分每个子阵列,直到子阵列的长度为1

合并排序是自下而上的。它首先通过数组进行传递,“合并”相邻项。因此,在第一次传递之后,数组是
[2,7,1,8,3,6,4,5]
。接下来,它合并相邻的两个元素数组。第一次合并是子数组
[2,7,1,8]
,产生
[1,2,7,8]
。第二次合并是
[3,6,4,5]
,生成完整的数组
[1,2,7,8,3,4,5,6]

最后,它合并两个四元素子数组,生成排序后的数组

您的代码显然是自上而下工作的:它划分初始数组,然后递归地划分左、右子数组。不涉及合并,而是一个附加步骤,用于从已排序的分区重新组装子阵列

注意,人们有时会谈论“自上而下”或“自下而上”合并排序。如果算法是迭代或递归编写的,那么这就更重要了,而不是实际排序工作是如何完成的。无论如何实现,它总是从合并两个单元素子阵列(相邻项)开始。

我们通常将
len(未排序)<1
替换为
not unsorted
,但在您的算法中