繁体   English   中英

使用中位数作为 pivot 的快速排序算法

[英]Quick Sort Algorithm using the median as a pivot

想要一些关于这个问题的答案:我想做快速排序,将第一个、最后一个和列表中间的元素之间的中值作为 pivot。 目前我有这段代码,我真的不明白为什么它会变得一团糟......

list = []
n = int(input(""))
for i in range(0, n):
    elements = int(input())
    list.append(elements)

def qs(array, left, right):
    if left < right:
        div_pos = div(array, left, right)
        qs(array, left, div_pos - 1)
        qs(array, div_pos + 1 , right)



def div(array, left, right):
    i = left
    j = right - 1
    pivot = array[right]

    while i < j:
        while i < right and array[i] < pivot:
            i += 1
        while j > left and array[j] >=pivot:
            j-= 1
        if i < j:
            array[i], array[j] = array[j], array[i]

    if array[i] > pivot:
        array[i], array[right] = array[right], array[i]

    return i

    return array



for i in range(len(list)):
    print ("%d" % list[i])

如果我只将def div()放在def qs() ) 之外,代码对我有用

import random

random.seed(0)

array = []

#n = int(input(""))
#for i in range(n):
#    value = int(input())
#    array.append(value)

array = [random.randint(0, 100) for x in range(20)]

def div(array, left, right):
    i = left
    j = right - 1
    pivot = array[right]

    while i < j:
        while i < right and array[i] < pivot:
            i += 1
        while j > left and array[j] >=pivot:
            j-= 1
        if i < j:
            array[i], array[j] = array[j], array[i]

    if array[i] > pivot:
        array[i], array[right] = array[right], array[i]

    return i

def qs(array, left, right):
    if left < right:
        div_pos = div(array, left, right)
        qs(array, left, div_pos - 1)
        qs(array, div_pos + 1 , right)
    return array

print('before:', array)

qs(array, 0, len(array)-1)
#for value in array:
#    print(value)

print('after :', array)

我用随机值而不是input()对其进行了测试。

我使用了seed(0) ,所以总是得到相同的随机值。

before: [49, 97, 53, 5, 33, 65, 62, 51, 100, 38, 61, 45, 74, 27, 64, 17, 36, 17, 96, 12]
after : [5, 12, 17, 17, 27, 33, 36, 38, 45, 49, 51, 53, 61, 62, 64, 65, 74, 96, 97, 100]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM