Python 使用数组三个随机元素的中值作为轴心实现快速排序
我一直在尝试实现这一点,由于某种原因,列表没有得到排序,只是被随机洗牌 当我执行代码3次时,有3种不同的输出: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:
[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
您正在从整个列表中选择三个可能的支点,而不仅仅是您当前正在处理的列表的分区。我认为这将是一个非常好的学习机会,让您仔细研究自己的实现并找出代码中的错误。谢谢您的评论!在意识到我确实是在从整个列表中进行选择之后,我很快找到了一种方法,从我目前正在处理的子阵列中选择随机数。再次感谢!您正在从整个列表中选择三个可能的支点,而不仅仅是您当前正在处理的列表的分区。我认为这将是一个非常好的学习机会,您可以仔细研究自己的实现并找到代码中的错误。谢谢您的评论!在意识到我确实是在从整个列表中进行选择之后,我很快找到了一种方法,从我目前正在处理的子阵列中选择随机数。再次感谢!