排序总结(快速排序、归并排序、堆排序)

1.随机取数组中一个数作为flag。(初始化哨兵位置) 2.初始化左右边界为 left, right,即设定从左到右的指针i,从右到左的指针j。 3.将数组分为两份,比flag小的放左边,比flag大的放右边。 当 i<=j时:

i从左往右扫,找到大于等于flag的数。
j从右往左扫,找到小于等于flag的数。
左指针指向大于flag位置,右指针指向小于flag的位置,此时如果i仍然<=j,则交换左右指针下标对应的数值,然后 i(左指针),j(右指针)各走一步继续。
4.当实现完flag的左小右大时候,

如果 i<right,[i,right]作为右边的数组递归快排;
如果 left<j,[left,j]作为左边的数组递归快排;
5.外层调用quicksort函数,传入数组、数组0下标、数组尾下标(注意是len(nums)-1)

时间复杂度是O(nlog(n)) 空间复杂度是O(1)

快速排序口诀:

1.随机选个哨兵
2.左右设个指针
3.左指未碰右指
4.左指小往右加
5.右指大往左减
6.ij遇交互契
7.跳出来两个如果
8.分治开始了
9.数组 左指和尾边界
10.数组 头边界和右指

def quicksort(nums,left,right):
    flag=nums[random.randint(left,right)]
    i,j=left,right
    while i<=j:
        while nums[i]<flag:i+=1
        while nums[j]>flag:j-=1
        if i<=j:
            nums[i],nums[j]=nums[j],nums[i]
            i+=1
            j+=1
        if i<right:quicksort(nums,i,right)
        if j>left:quicksort(nums,left,j)
quicksort(nums,0,len(nums)-1)
return nums

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值