【发布时间】:2020-09-25 03:00:19
【问题描述】:
我正在发布关于三个问题的快速排序中位数的帮助。我需要实现一个使用枢轴的分区,该枢轴是输入列表中三个元素(开始、中间、结束)的中位数,同时考虑到一些边缘情况。
简而言之,我需要实现一个方法 choose_median(),它返回中值元素(选择的枢轴)的索引;打印上一步选择的枢轴的索引;创建一个 partition() 方法,以便它可以与所选的枢轴一起工作;在第一个分区之后打印列表。
我在处理偶数列表时遇到了麻烦:
"注意,如果列表的大小是偶数,有两种方法可以选择中间元素。为避免歧义,在这种情况下选择索引较小的元素作为中间元素。"
这似乎很难,我已经被难住了一段时间。特别是在长度为 2 或更少的列表上。
如果给定适当的枢轴,我有一个适用于案例的分区方法:
def partition(arr, pivot):
less, equal, greater = [], [], []
for val in arr:
if val < pivot: less.append(val)
if val == pivot: equal.append(val)
if val > pivot: greater.append(val)
return less+equal+greater, pivot
我也可以更改此函数以与枢轴一起使用。
def partition(lst, pivot, start, end):
j = start
for i in range(start + 1, end + 1):
if lst[i] <= lst[start]:
j += 1
lst[i], lst[j] = lst[j], lst[i]
lst[start], lst[j] = lst[j], lst[start]
return j
选择奇数列表的中位数很简单。
另外,我已经看到/知道如何在这里实现这些实现:
Python: Quicksort with median of three
任何帮助将不胜感激。
【问题讨论】: