Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用数组三个随机元素的中值作为轴心实现快速排序_Python_Algorithm_Sorting_Quicksort_Median - Fatal编程技术网

Python 使用数组三个随机元素的中值作为轴心实现快速排序

Python 使用数组三个随机元素的中值作为轴心实现快速排序,python,algorithm,sorting,quicksort,median,Python,Algorithm,Sorting,Quicksort,Median,我一直在尝试实现这一点,由于某种原因,列表没有得到排序,只是被随机洗牌 当我执行代码3次时,有3种不同的输出: [2,4,3,6,5,1] [1,6,3,2,4,5] [1,4,2,3,5,6] 使用固定轴心,例如a[low]效果非常好,当我尝试实现三个随机数的中值时,它会变得混乱,我不确定这是为什么。 我错过了什么/做错了什么 def determine_median(a, b, c): if a > b: if a < c:

我一直在尝试实现这一点,由于某种原因,列表没有得到排序,只是被随机洗牌

当我执行代码3次时,有3种不同的输出:

  • [2,4,3,6,5,1]
  • [1,6,3,2,4,5]
  • [1,4,2,3,5,6]
  • 使用固定轴心,例如
    a[low]
    效果非常好,当我尝试实现三个随机数的中值时,它会变得混乱,我不确定这是为什么。 我错过了什么/做错了什么

    def determine_median(a, b, c):
            if a > b:
                if a < c:
                    median = a
                elif b > c:
                    median = b
                else:
                    median = c
            else:
                if a > c:
                    median = a
                elif b < c:
                    median = b
                else:
                    median = c
            return median
    
    
    def partition(A, low, high):
        l = len(A)
    
        # taking 3 random elements out of the array
        m1 = A[random.randint(0,l-1)]
        m2 = A[random.randint(0,l-1)]
        m3 = A[random.randint(0,l-1)]
        median = determine_median(m1, m2, m3)
        pivot = median
        i = low
        for j in range(low + 1, high + 1):
            if (A[j] < pivot):
                i = i + 1
                A[i], A[j] = A[j], A[i]
        A[i], A[low] = A[low], A[i]
        return i
    
    
    def quicksort (A, low, high):
        if low < high:
            m = partition(A, low, high)
            quicksort (A, low, m-1)
            quicksort (A, m+1, high)
        return A
    
    # testing
    arr = [6,5,4,3,2,1]
    n = len(arr)
    print(quicksort(arr, 0, n-1))
    
    def确定中位数(a、b、c):
    如果a>b:
    如果ac:
    中位数=b
    其他:
    中位数=c
    其他:
    如果a>c:
    中位数=a
    elif b
    编辑:

    我的问题是,我是从整个列表中选择的,而不是像Jasonharper指出的那样从当前子阵列中选择的

    下面是固定配分函数:

    def partition(A, low, high):
        m1 = A[random.randint(low,high)]
        m2 = A[random.randint(low,high)]
        m3 = A[random.randint(low,high)]
        median = determine_median(m1, m2, m3)
        pivotindex = A.index(median)
        A[low], A[pivotindex] = A[pivotindex], A[low]
        pivot = A[low]
        i = low
        for j in range(low + 1, high + 1):
            if (A[j] < pivot):
                i = i + 1
                A[i], A[j] = A[j], A[i]
        A[i], A[low] = A[low], A[i]
        return i
    
    def分区(A、低、高): m1=A[random.randint(低、高)] m2=A[random.randint(低、高)] m3=A[random.randint(低、高)] 中位数=确定中位数(m1、m2、m3) 数据透视指数=A.指数(中位数) A[low],A[pivotindex]=A[pivotindex],A[low] 枢轴=A[低] i=低 对于范围内的j(低+1,高+1): 如果(A[j]<枢轴): i=i+1 A[i],A[j]=A[j],A[i] A[i],A[low]=A[low],A[i] 返回i
    您正在从整个列表中选择三个可能的支点,而不仅仅是您当前正在处理的列表的分区。我认为这将是一个非常好的学习机会,让您仔细研究自己的实现并找出代码中的错误。谢谢您的评论!在意识到我确实是在从整个列表中进行选择之后,我很快找到了一种方法,从我目前正在处理的子阵列中选择随机数。再次感谢!您正在从整个列表中选择三个可能的支点,而不仅仅是您当前正在处理的列表的分区。我认为这将是一个非常好的学习机会,您可以仔细研究自己的实现并找到代码中的错误。谢谢您的评论!在意识到我确实是在从整个列表中进行选择之后,我很快找到了一种方法,从我目前正在处理的子阵列中选择随机数。再次感谢!