Python解决快速排序

递归

def partition_v2(start_index, end_index, array=None):
    # 取第一个位置的元素作为基准元素(也可以选择随机位置)
    if array is None:
        array = []
    pivot = array[start_index]
    mark = start_index
    for i in range(start_index + 1, end_index + 1):
        if array[i] < pivot:
            mark += 1
            array[mark], array[i] = array[i], array[mark]
    array[start_index] = array[mark]
    array[mark] = pivot
    return mark


def quick_sort(start_index, end_index, array=None):
    # 递归结束条件:startIndex大等于endIndex的时候
    if array is None:
        array = []
    if start_index >= end_index:
        return
    # 得到基准元素位置
    pivot_index = partition_v2(start_index, end_index, array)
    # 根据基准元素,分成两部分递归排序
    quick_sort(start_index, pivot_index - 1, array)
    quick_sort(pivot_index + 1, end_index, array)


if __name__ == '__main__':
    my_array = list([3, 4, 14, 1, 5, 6, 7, 8, 1, -1, 0, 9, 11])
    quick_sort(0, len(my_array) - 1, my_array)
    print(my_array)

def partition(start_index, end_index, array=None):
    # 取第一个位置的元素作为基准元素(也可以选择随机位置)
    if array is None:
        array = []
    pivot = array[start_index]
    mark = start_index
    for i in range(start_index + 1, end_index + 1):
        if array[i] < pivot:
            mark += 1
            p = array[mark]
            array[mark] = array[i]
            array[i] = p
    array[start_index] = array[mark]
    array[mark] = pivot
    return mark


def quick_sort(start_index, end_index, array=None):
    # 用一个集合栈来代替递归的函数栈
    if array is None:
        array = []
    quick_sort_stack = []
    # 整个数列的起止下标,以哈希的形式入栈
    root_param = {"startIndex": start_index, "endIndex": end_index}
    quick_sort_stack.append(root_param)

    # 循环结束条件:栈为空时结束
    while len(quick_sort_stack) > 0:
        # 栈顶元素出栈,得到起止下标
        param = quick_sort_stack.pop()
        # 得到基准元素位置
        pivot_index = partition(param.get("startIndex"), param.get("endIndex"), array)
        # 根据基准元素分成两部分, 把每一部分的起止下标入栈
        if param.get("startIndex") < pivot_index - 1:
            left_param = {"startIndex": param.get("startIndex"), "endIndex": pivot_index - 1}
            quick_sort_stack.append(left_param)
        if pivot_index + 1 < param.get("endIndex"):
            right_param = {"startIndex": pivot_index + 1, "endIndex": param.get("endIndex")}
            quick_sort_stack.append(right_param)


if __name__ == '__main__':
    my_array = list([3, 4, 14, 1, 5, 6, 7, 8, 1, -1, 0, 9, 11])
    quick_sort(0, len(my_array) - 1, my_array)
    print(my_array)
posted @   阿无oxo  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示