![](/img/trans.png)
[英]Using merge sort/quick sort to sort attribute of class objects in Python
[英]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.