Python实现 《算法导论 第三版》中的算法 第7章 快速排序

版权声明:本文为博主原创文章,如有转载请标注来源。 https://blog.csdn.net/shengchaohua163/article/details/83217290

第7章 快速排序

1. 快速排序

快速排序是一种最坏情况时间复杂度为 Θ ( n 2 ) \Theta(n^2) 的排序算法。虽然最坏情况很差,但是快速排序通常是实际排序应用中最好的选择。因为它的平均性能非常好:期望时间复杂度为 Θ ( n l g n ) \Theta(nlgn) ,而且其中隐含的常数因子非常小。另外,它还是原址排序,空间复杂度为 O ( 1 ) O(1)

下面实现了书中的伪代码和习题,包括:

  • P95:QUICKSORT,快速排序,初始调用为QUICKSORT(A, 0, A.length-1),见quick_sort
  • P95:PARTITION,快速排序中的数组划分,实现了对子数组A[p…r]的原址重排,见partition
  • P100:RANDOMIZED-PARTITIONRANDOMIZED-QUICKSORT,随机选取主元的划分和对应的快速排序,见randomized_partitionrandomized_quick_sort。因为主元元素是随机选取的,我们期望在平均情况下,对输入数组的划分是比较均衡的。
  • P103:思考题7-1,Hoare划分,见hoare_partitionhoare_quick_sort
def quick_sort(A, p, r):
    if p < r:
        q = partition(A, p, r)
        quick_sort(A, p, q-1)
        quick_sort(A, q+1, r)
        

def partition(A, p, r):
    x = A[r]
    i = p - 1
    for j in range(p, r):
        if A[j] <= x:
            i += 1
            A[i], A[j] = A[j], A[i]
    A[i+1], A[r] = A[r], A[i+1]
    return i + 1


def randomized_partition(A, p, r):
    import random
    i = random.randint(p, r)
    A[i], A[r] = A[r], A[i]
    return partition(A, p, r)


def randomized_quick_sort(A, p, r):
    if p < r:
        q = randomized_partition(A, p, r)
        randomized_quick_sort(A, p, q-1)
        randomized_quick_sort(A, q+1, r)


def hoare_partition(A, p, r):
    x = A[p]
    i = p
    j = r
    while True:
        while j > i and A[j] >= x:
            j -= 1
        while i < j and A[i] <= x:
            i += 1
        if i < j:
            A[i], A[j] = A[j], A[i]
        else:
            A[p] = A[j] #书上的伪代码有问题 缺少这两步
            A[j] = x
            return j
        

def hoare_quick_sort(A, p, r):
    if p < r:
        q = hoare_partition(A, p, r)
        hoare_quick_sort(A, p, q-1)
        hoare_quick_sort(A, q+1, r)
        

def test():
    A = [2, 8, 7, 1, 3, 5, 6, 4] # P96例子
    quick_sort(A, 0, len(A)-1)
    print(A)
    
    A = [2, 8, 7, 1, 3, 5, 6, 4]
    randomized_quick_sort(A, 0, len(A)-1)
    print(A)
    
    A = [13, 19, 9, 5, 12, 8, 7, 4, 11, 2, 6, 21] # P103思考题7-1
    hoare_quick_sort(A, 0, len(A)-1)
    print(A)
    
    
if __name__ == '__main__':
    test()  

猜你喜欢

转载自blog.csdn.net/shengchaohua163/article/details/83217290