程序员须掌握的数据结构:快速排序python代码实现

2018-10-3110:15:51数据结构与算法Comments2,296 views字数 859阅读模式

快速排序,时间复杂度O(nlogn)。不需要额外空间14行,需要额外空间7行。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/7598.html

# 源码: https://github.com/SpikeKing/data_structure_with_python
def quick_sort(alist, fst, lst):
    """
    快速排序
    1. 确定终止条件,起始大于等于终止;
    2. 起始fst和终止lst的位置,枢轴值pivot是第1个值;
    3. 遍历i和j,i是第2个,j是最后一个;
    4. 循环交换,直到i和j交叉;
    5. 枢轴索引取i和j最小的1个;
    6. 交换枢轴位置的值与起始位置的值;
    7. 递归调用左右两部分;
    8. 16行
    :param alist: 待排序列表
    :param fst: 起始idx
    :param lst: 终止idx
    :return: None
    """
    if fst >= lst:
        return
    pivot = alist[fst]
    i, j = fst + 1, lst
    while i < j:
        while alist[i] < pivot:
            i += 1
        while alist[j] > pivot:
            j -= 1
        if i < j:
            alist[i], alist[j] = alist[j], alist[i]
            i, j = i + 1, j - 1
    p_idx = min(i, j)  # 枢轴索引
    alist[fst], alist[p_idx] = alist[p_idx], alist[fst]
    quick_sort(alist, fst, p_idx - 1)
    quick_sort(alist, p_idx + 1, lst)


def quick_sort_v2(alist):
    """
    快速排序,需要额外空间
    :param alist: 待排序列表
    :return: 排序列表
    """
    if len(alist) <= 1:
        return alist
    pivot = alist[0]
    small = [i for i in alist if i < pivot]
    mid = [i for i in alist if i == pivot]
    large = [i for i in alist if i > pivot]
    return quick_sort_v2(small) + mid + quick_sort_v2(large)
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/7598.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/suanfa/7598.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定