我喜欢考察面试者对递归和迭代的理解。

一般会先出一道如何使用递归求解,再出一道使用迭代求解上题。

本来准备用快速排序作为考题。想了想自己作为面试者,肯定是不会的。

就没有为难面试者。

 

但是作为算法分析题,这两种技巧还是需要掌握。

我自己就花时间调研了一下:

 

递归版:

def partition(A, lo, hi):
    tmp_p = int(lo + (hi - lo) / 2) 
    tmp_value = A[tmp_p]
    A[lo], A[tmp_p] = A[tmp_p], A[lo]
    p = lo
    for i in range(lo + 1, hi + 1):
        if A[i] < tmp_value:
            p += 1
            A[i], A[p] = A[p], A[i]
    A[p], A[lo] = A[lo], A[p]
    return p

def quick_sort(lst, start, end):
    if start < end:
        split = partition(lst, start, end)
        quick_sort(lst, start, split - 1)
        quick_sort(lst, split + 1, end)

 

迭代版 (同一 partition)

def quicksort(A):
    lo = 0
    hi = len(A) - 1
    range_queue = Queue()
    range_queue.put([lo, hi])
    while not range_queue.empty():
        lo, hi = range_queue.get()
        if lo < hi:
            p = partition(A, lo, hi)
            range_queue.put([lo, p - 1])
            range_queue.put([p + 1, hi])

 

因为不是所有递归算法都可以转为迭代的,或者很难转化

上面快速排序的迭代,我是看到 Leslie Lamport  的视频,才知道。

jiamo post at 2021-02-23