快速排序算法

python 实现快排


思想
1.分而治之,数组开头选择划分元素pivot
i 小于等于pivot的放左边 i+=1
j 大于pivot的放右边 j-=1
两边停止则交换值(i<j)

原位排序,只需要很少的辅助空间

2.平均时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
3.最坏时间复杂度 O ( n 2 ) O(n^2) O(n2)

要求:十五分钟以内完成代码

在这里插入图片描述


def quick_sort(alist,start,end):
    
    if len(alist)<=1:
        return alist
    if start<end:
        split = partition(alist,start,end)
        quick_sort(alist,start,split-1)
        quick_sort(alist,split+1,end)
        
    return alist


def partition(alist,start,end):
    pivot = start
    i = start+1
    j = end
    
    while True:
        while alist[i]<=alist[pivot]:
            if i<j:
                i += 1
            else:
                break
        while alist[j]>alist[pivot]:
            j -= 1
        if i < j:
            alist[i],alist[j] = alist[j],alist[i]
        else:
            break
    
    alist[pivot],alist[j] = alist[j],alist[pivot]
    
    return j
    
if __name__=="__main__":
    alist = [4,1,2,3,1,5,6,10,2,3]
    r = quick_sort(alist,0,len(alist)-1)
    print(r)

可视化实现


def partition(alist, start, end):
    pivot = start
    i = start + 1
    j = end

    while True:
        while alist[i] <= alist[pivot] :
            i += 1
            if i > j:
                break
        
        while alist[j] > alist[pivot]:
            j -= 1

        if i <= j:
            alist[i], alist[j] = alist[j], alist[i]

        else:
            break

    # 交换pivot 与j 的值
    alist[pivot], alist[j] = alist[j], alist[pivot]

    return j


def quick_sort(alist, start, end):
    if start < end:
        mid = partition(alist, start, end)
        quick_sort(alist, start, mid-1)
        quick_sort(alist, mid+1, end)

    else:
        return alist

if __name__ == "__main__":

    from matplotlib import pyplot as plt
    plt.rcParams['font.sans-serif'] = ["SimHei"]
    import random
    import numpy as np

    alist = np.random.randint(20, 100, 20)
    print("初始结果:", alist)
    quick_sort(alist, 0, len(alist) - 1)

    print("排序的结果:", alist)   

    plt.plot(range(1, len(alist)+1), alist, "r--", label="快速排序")
    plt.xlabel("x轴")
    plt.ylabel("序列值")
    plt.title("快速排序")
    plt.grid()
    plt.legend()
    plt.show()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laufing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值