用Python快速排序

时间:2014-11-28 03:26:11

标签: python

好的,我已经编辑了我的代码,感谢下面的评论。但它仍然无法正常工作......请帮助。

编辑:

import random
def quickSort(A,start,size): # randomized version
 if size<2:
     return
 pivot=A[int(random.choice(A[start:start+size])
 L=start
 U=L+size-1
 while L<U:
     while A[L]<pivot:
         L+=1
     while A[U]>pivot:
         U-=1
     A[L],A[U]=A[U],A[L]
 quickSort(A,start,L)
 quickSort(A,L+1,size-L-1)

 A=[22,77,55,33,88,11] 
 quickSort(A,0,6)
 print A

上一篇文章:

我在Python中实现了快速排序。以下是实施。但它没有正确排序。似乎原始数组A在某些步骤中不会受到递归的影响。

请帮忙。谢谢!

import random

def quickSort(A,size): # randomized version
     if size<2:
         return
     pivot=A[int(random.uniform(0,size))%size]
     L=0
     U=size-1
     while L<U:
         while A[L]<pivot:
             L+=1
         while A[U]>pivot:
             U-=1
         A[L],A[U]=A[U],A[L]
     quickSort(A,L)
     quickSort(A[L:],size-L-1)

A=[33,50,18,2,66] 
quickSort(A,5)
print A

2 个答案:

答案 0 :(得分:0)

您对quickSort(A,0,L)的号码在位置0开始时已经硬编码,应该从start开始,同一个地方L开始(L=start)。

然后你的???可以start+size-1就像U开始的地方一样。

并调整random.uniform(..)来电,因为它要求从位置开始的范围并以项目数结束 - 它会向后,例如从50开始到8 结束。这也需要start, start+size

答案 1 :(得分:0)

让我们引用Jon Bentley(“编程珍珠”,Addison-Wesley,1986,脚注第110页):

  

Quicksort的大多数演示都使用基于两个的分区方案   接近指数,....虽然该计划的基本思想是   简单,我总是发现细节棘手 - 我曾经花了   两天中最好的一部分追逐一个隐藏在短片中的bug   分区循环。初稿的读者抱怨说   标准的双指数法实际上比Lomuto的简单,并且   草拟了一些代码来说明他的观点;我找到了,我停止了照顾   两个错误。

您正在使用接近指数计划,不是吗?

这里是Nico Lomuto在其所有美景中的分区,以及一些测试

from random import randrange

def order(A, L, U):

    p = randrange(L,U+1)
    A[L], A[p] = A[p], A[L]
    V = A[L]
    print "# random value:", V
    M = L
    for K in range(L, U+1):
        if A[K]<V:
            M = M+1
            A[M], A[K] = A[K], A[M]
    A[L], A[M] = A[M], A[L]
    return M

N = 20
for i in range(10):
    l = [randrange(0,10) for _ in range(N)]
    s = order(l,0,N-1)
    print "#", l[:s], [l[s]], l[s+1:]
制造

# random value: 5
# [2, 3, 4, 1, 0, 1, 1, 4, 0, 4, 0, 1, 4] [5] [9, 5, 7, 6, 9, 9]
# random value: 2
# [0, 0, 0, 1, 1] [2] [7, 3, 2, 6, 5, 8, 7, 8, 4, 4, 3, 9, 8, 6]
# random value: 8
# [2, 5, 3, 1, 5, 4, 2, 2, 3, 5, 0, 6, 3, 2, 2] [8] [8, 9, 8, 9]
# random value: 5
# [1, 1, 1, 1, 0, 0, 4] [5] [7, 8, 9, 5, 9, 9, 9, 8, 9, 8, 7, 9]
# random value: 7
# [2, 0, 5, 2, 1, 4, 4, 4, 5, 3, 2, 1, 0, 4, 6, 5, 3] [7] [9, 9]
# random value: 4
# [2, 2, 1, 0, 3, 3, 3, 2, 2, 2, 3, 2] [4] [4, 4, 9, 9, 6, 6, 9]
# random value: 6
# [4, 2, 5, 5, 0, 1, 4, 3, 0, 0] [6] [9, 8, 9, 7, 8, 9, 6, 9, 8]
# random value: 3
# [0, 2, 1, 0, 2] [3] [3, 4, 6, 9, 3, 8, 4, 8, 9, 8, 3, 3, 7, 9]
# random value: 5
# [0, 1, 3, 1, 2, 1, 3, 4, 0] [5] [6, 6, 5, 8, 5, 7, 5, 8, 5, 5]
# random value: 6
# [0, 5, 2, 1, 1, 0, 3, 3, 0] [6] [7, 9, 6, 6, 6, 9, 6, 9, 8, 6]

我认为只要您付出一点努力,就可以编写快速排序的正确实现。

PS:校园图书馆有可能有一本宾利的书,我发现这是一本非常愉快的读物......