【问题标题】:Quicksort - Median of Three with Edge Cases快速排序 - 三的中位数与边缘情况
【发布时间】: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

任何帮助将不胜感激。

【问题讨论】:

    标签: python quicksort


    【解决方案1】:

    您似乎比实际情况更难做到这一点。首先,我认为您混淆了“中值”和“中间元素”的术语。

    列表的中间元素,向下取整,就是lst[(len(lst) - 1)//2]:你的索引是列表长度,减1,整数除以2。

    因此,您的枢轴选择很容易:获取三个指示的元素,对它们进行排序,然后返回中间元素。

    def choose_pivot(lst):
        return sorted( [lst[0],
                        lst[-1],
                        lst[(len(lst)-1) //2]
                       ])[1]
    

    【讨论】:

      猜你喜欢
      • 2018-11-27
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      • 2015-01-20
      • 2020-04-30
      相关资源
      最近更新 更多