笨办法学python3续 learn more python 3 in hard way ex16(final) quicksort 快速排序

代码:

from dllist import DoubleLinkedList
from queue import Queue
from random import randint

def node_at(numbers, i):
    count = 0
    node = numbers.begin
    while count < i:
        count += 1
        node = node.next
        assert node, f"Attempted to get node past end {i}"
    return node


def quick_sort(numbers, lo, hi):
    """Sorts a list of numbers using quick sort.
    You must implement this one based on the p-code
    at https://en.wikipedia.org/wiki/Quicksort or
    any other reference.
    """
    if lo < hi:
        p = quick_sort_partition(numbers, lo, hi)
        quick_sort(numbers, lo, p - 1)
        quick_sort(numbers, p + 1, hi)

def quick_sort_partition(numbers, lo, hi):
    print(f">>lo{lo},hi{hi}")
    pivot = node_at(numbers, hi)
    i = lo - 1

    for j in range(lo, hi):
        node_j = node_at(numbers, j)
        if node_j.value < pivot.value:
            i += 1
            if i != j:
                node_i = node_at(numbers, i)
                print(f">>>less before swap node_i,node_i{node_i},node_j{node_j}")
                node_i.value, node_j.value = node_j.value, node_i.value
                print(f">>>less after swap node_i,node_i{node_i},node_j{node_j}")
    node_hi = node_at(numbers, hi)
    node_i = node_at(numbers, i + 1)

    if node_hi.value < node_i.value:
        print(f">>>final less swap node_i,node_i{node_i},node_j{node_j}")
        node_hi.value, node_i.value = node_i.value, node_hi.value
        print(f">>>final after swap node_i,node_i{node_i},node_j{node_j}")
        print("整的一行排好了",numbers.dump())
    return i + 1



def random_list(count):
    numbers = DoubleLinkedList()
    for i in range(count, 0, -1):
        numbers.shift(randint(0, 10))

    return numbers

max_numbers=5

numbers = random_list(max_numbers)
print(">>before")
print(numbers.dump())
quick_sort(numbers, 0, numbers.count() - 1)#lo=0 high=4
print(">>after")
print(numbers.dump())


代码截图: debugger下运行的
笨办法学python3续 learn more python 3 in hard way ex16(final) quicksort 快速排序

笨办法学python3续 learn more python 3 in hard way ex16(final) quicksort 快速排序
带了断点就很容易判断代码运行的 不行就全打了 看参数
但是还是比较累的
sort这个实验都是基于双向链表的
所以最好跑一个值都不一样的结果进行分析
node:[value,next,prev]
我们只要关注value就行了
这个重要的是lo,high 和一个pivot
pivot是这个未排序序列的最后一个
然后我们通过i和j来更换数值 check到pivot
再回到 quick_sort(numbers, lo, hi)
p = quick_sort_partition(numbers, lo, hi)
quick_sort(numbers, lo, p - 1)
quick_sort(numbers, p + 1, hi)
pivot前移一个,在从头开始遍历