繁体   English   中英

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

[英]Is this Quick sort or Merge sort?

这是函数:

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)

我很难将其定义为快速排序或合并排序。 从概念上讲,我认为它符合“快速排序”的定义:它使用枢轴将元素分成比枢轴子集更大或更小的元素,然后对它们进行递归排序。 但另一方面,它非常让我想起了Merge排序,因为它递归地将给定列表分解为较小的块,然后将它们重新组合在一起(尽管围绕“枢轴”)。

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

Quicksort分区,MergeSort合并。

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

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

显然,这是快速排序的实现,而不是合并排序。 想一想Quicksort的工作原理:它在整个数组上选取一个轴,然后重新排列,以使轴的所有剩余值均小于轴的值,而右边的所有均大于轴的值。 这样,给定阵列[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]

Quicksort是自上而下的。 它先对整个数组进行分区,然后对两个子数组进行分区,然后递归地对每个子数组进行分区,直到子数组的长度为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]

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

您的代码显然是自上而下工作的:它对初始数组进行分区,然后对左和右子数组进行递归分区。 不涉及合并,而是一个附加步骤,该步骤从排序的分区中重新组装了子数组。

请注意,人们有时会谈论“自上而下”或“自下而上”的合并排序。 如果算法是迭代编写的或递归编写的,那将有更多的作用,而不是实际的排序工作是如何完成的。 无论采用哪种实现方式,它始终都是通过合并两个单元素子数组(相邻项)开始的。

合并排序不需要在划分之前遍历整个数组进行比较。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM