快速排序的实现(python)

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import random

#快速排序基础
def PARTITION(A, p, r):
    x = A[r]
    i = p - 1;
    j = p
    while(j < r):
        if (A[j] < x):
            i += 1
            temp = A[i]
            A[i] = A[j]
            A[j] = temp
        j += 1

    i += 1
    temp = A[i]
    A[i] = A[r]
    A[r] = temp

    return i

def RANDOMIZED_PARTITION(A, p, r):
    i = random.randint(p, r)
    temp = A[i]
    A[i] = A[r]
    A[r] = temp
    return PARTITION(A, p, r)

#使用两个递归的版本
def QUICKSORT(A, p, r):
    if (p < r):
        q = RANDOMIZED_PARTITION(A, p, r)
        #写代码时这步碰到一个坑,没有写成q-1,则会进入一个死循环,因为每次返回的q都会是自己传入的q
        QUICKSORT(A, p, q-1)
        QUICKSORT(A, q+1, r)

#使用尾递归版本这种栈深度最坏情况O(n)
def TAIL_RECURSIVE_QUICKSORT(A, p, r):
    while(p < r):
        q = RANDOMIZED_PARTITION(A, p, r)
        TAIL_RECURSIVE_QUICKSORT(A, p, q-1)
        p = q + 1

#这种情况每次将元素少的进行递归,元素多的进行循环,则最坏情况栈深度能为O(lgn)
def TAIL_RECURSIVE_QUICKSORT_OPTIMIZE(A, p, r):
    while(p < r):
        q = RANDOMIZED_PARTITION(A, p, r)
        if ((q-p) < (r-q)):
            TAIL_RECURSIVE_QUICKSORT_OPTIMIZE(A, p, q-1)
            p = q + 1
        else:
            TAIL_RECURSIVE_QUICKSORT_OPTIMIZE(A, q+1, r)
            r = q - 1

if __name__ == '__main__':
    A = [5, 4, 6, 9, 12, 35, 34, 32, 11, 23, 21, 14, 3, 8]
    TAIL_RECURSIVE_QUICKSORT_OPTIMIZE(A, 0, len(A)-1)
    print(A)

猜你喜欢

转载自blog.csdn.net/cckooo/article/details/53679141