快速排序

直接上源码

#快速排序
"""思路:首先在第一个位置挖一个坑(key),然后右指针开始向左移动,直到找到一个比坑
中数字小的,把坑填上,然后原来的小的地方多出来一个坑,现在左指针开始向右移动,直到
找到一个比右边停下来的坑小的填补上去,如此往复,直到两个指针重合,然后取重合地分界
的两个区间,继续调用递归算法"""
#开始

def transform(nums,i,j):        
    #ii和jj分别是左右指针的基准位置
    #定义交换函数
    #定义i,j指针
    
    key = nums[i]#挖坑
    while(i<j):
        while(i < j and nums[j]>=key):
            j-=1
        
        if(i<j):
            #当满足i<j的情况下,nums[j]>key了
            #则移动坑位
            #下面也是如此
            nums[i] = nums[j] 
            i+=1
        
        while(i < j and nums[i]<=key):
            i+=1
        
        if(i < j):
            nums[j] = nums[i]
            j-=1
    nums[i] = key#当重合之后就将key放回到坑位上  

    return i#返回两个指针重合的位置

def quick(nums,ii,jj):
    #jj=jjj-1#j超出范围了,因为数组是从零开始而不是1开始,所以要减去1
    if (ii<jj):
        #如果两个初始位置的指针满足左小于右的话那么
        i = transform(nums,ii,jj)#找到这个数组的中间坑位,j就是调整坑的位置
        quick(nums,ii,i-1)#对左边的子数组进行操作
        quick(nums,i+1,jj)#对右边的子数组进行操作
    return nums

if __name__ == "__main__":
    nums = [5,4,3,2,1,2,4,5,22,44,23,53,123]
    num = quick(nums,0,len(nums)-1)
    print(num)

简单来说,就是,先找一个基准数字作为一个坑位(可以是最左边的也可以是最右边的或者是随机找一个)

接着,设置左指针和右指针,先右指针找比坑小的交换左右指针(不是坑位),左指针找比坑位大的交换左右指针(不是坑位),直到左右指针重合。

这是第一轮,下面的几轮就是将刚刚这个数组拆分为二,两个数组再次调用这个递归方法。

以上
有点复杂,下面是简洁一点的代码实现


def quick(nums,i,j):
    m = i
    n = j
    if (i<j):
        key = nums[i]
        while(i<j):
            while(i < j and nums[j]>=key):
                j-=1
    
            if(i<j):
                nums[i] = nums[j] 
                i+=1
            
            while(i < j and nums[i]<=key):
                i+=1
            
            if(i < j):
                nums[j] = nums[i]
                j-=1
        nums[i] = key
        print(nums)
        p = i

        quick(nums,m,p-1)
        quick(nums,p+1,n)
    return nums

if __name__ == "__main__":
    nums = [5,4,3,2,1,2,4,5,22,44,23,53,123]
    num = quick(nums,0,len(nums)-1)
    print(num)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值