python 快速排序

算法原理:

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。

步骤为:

挑选基准值:从数列中挑出一个元素,称为"基准"(pivot);
分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成;
递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。
递归到最底部的判断条件是数列的大小是零或一,此时该数列显然已经有序。

公共实例方法:

def partition(arr, low, high, reverse=False):
    i = (low - 1)  # 最小元素索引
    pivot = arr[high]  # 基准值

    for j in range(low, high):

        # 已基准值 pivot 对数组对象进行位置排序
        if (not reverse and arr[j] <= pivot) or (reverse and arr[j] > pivot):
            i = i + 1
            arr[i], arr[j] = arr[j], arr[i]

    arr[i + 1], arr[high] = arr[high], arr[i + 1]
    return (i + 1)


# 快速排序函数
def quickSort(arr, low=None, high=None, reverse=False):
    """
    :param arr: 排序数组
    :param low: 起始索引
    :param high: 结束索引
    :param reverse: 是否反向(倒叙/递减)排序
    :return:
    """
    if low is None:
        low = 0
    if high is None:
        high = len(arr) - 1
    if low < high:
        pi = partition(arr, low, high, reverse)
        
        quickSort(arr, low, pi - 1, reverse)  # 递归
        quickSort(arr, pi + 1, high, reverse)


if __name__ == '__main__':
    _list = [23, 12, 5, 31, 17, 21]
    quickSort(_list, reverse=False)
    print(_list)

完成

参考内容:Python 快速排序
(以上内容参考来自菜鸟教程,并基于其内容实现正向或反向排序)

posted @ 2024-10-31 04:22  二月雪  阅读(19)  评论(0编辑  收藏  举报