python实现快速排序

网上的快速排序基本都是java写的,想找个简单易懂的python版很难,决定自己写一个,新手,如果发现bug或者可优化的点请温柔指出,轻喷

首先是快速排序的思想,即找到一个pivot值(一般取列表的第一个元素的值),把小于pivot的元素全部排到它左边,把大于pivot值的元素全部排到它右边,然后对左右2个字列表递归调用函数即可

代码步骤

1. 设置下标0的元素为基准值pivot

2. 从右往左扫描,标记第一个小于pivot的值的元素的下标,记为high或者right

3. 从左往右扫描,标记第一个大于pivot的值的元素的下标,记为low或者left

4. 交换left和right下标上的元素

5. 重复2, 3, 4直到 right == left

        5.1 如果重合点的值小于pivot,则交换该元素与pivot

        5.2 如果重合点的值大于pivot,意味着这轮白跑了,pivot右侧的值全都比他大

6. 1~5跑完,此时列表被分成3部分,左列表(里面的值全小于pivot), pivot, 右列表(里面的值全部大于pivot),对这两个列表重复1~5的步骤,直至达成递归结束条件

代码

from random import randint


def quick_sort(lista, i, j):
    """
    快速排序
    :param lista:
    :param i: 列表最左侧的值的下标,初始为0
    :param j: 列表最右侧的值的下标,初始为len(lista) - 1
    :return: 在原列表上排序,不需要返回值
    """
    # 结束递归
    if i >= j:
        return

    key = i
    pivot = lista[key]
    low = i + 1
    high = j

    for high in range(high, low - 1, -1):  # 从右往左检索high值
        if lista[high]< pivot:
            for low in range(low, high + 1):  # 从左往右检索low值
                if high == low:  # 5.1 交换重合点与pivot的元素,同时记录该点下标
                    lista[key], lista[low] = lista[low], lista[key]
                    key = low
                    break
                if lista[low]> pivot:  # 4. 交换low与high下标上的元素
                    lista[low], lista[high] = lista[high], lista[low]
                    break

    # 对子列表递归调用本函数
    print(lista[i: j + 1])
    quick_sort(lista, i, key - 1)
    quick_sort(lista, key + 1, j)
    return


lista = [randint(1, 100) for i in range(50)]
# lista = [4, 74, 63, 73, 8, 80, 44, 33, 87, 20]
print(lista)
quick_sort(lista, 0, len(lista) - 1)
print(lista)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值