3、快速排序

第一步:首先选定待排序数组当中的一个数作为基准数    第二步:定义left和right两个游标,分别位于数组的第一个和最后一个位置    
    第三步:让right游标先去移动,去找比当前基准数小的,找到后停止    第四步:让left游标后去移动,去找比当前基准数大的,找到后停止    
第五步:left游标指向的值和right游标指向的值进行交换,循环指向三四五步,直到left和right相遇。
第六步:让相遇位置的数和基准数交换-->基准数前边的都比基准数小,后边的都比基准数大
第七步:以基准数为中间节点,拆分出左右两部分!!,重新执行上述所有程序!

#快速排序法
def partition(nums,left,right):
    #left哨兵元素
    key=nums[left]
    while left<right:
        while left<right and nums[right]>=key:
            right-=1
        nums[left]=nums[right]
        while left<right and nums[left]<=key:
            left+=1
        nums[right]=nums[left]
    nums[left]=key
    return left
#方法一
def func(nums,start,end):
    if (start==end):
        return
    index=partition(nums,start,end)
    if index>start:
        func(nums, start, index-1)
    if index<end:
        func(nums,index+1,end)
 #方法2(非递归)
def func2(nums,start,end):
     stack =[end,start]
     while stack:
         high=stack.pop(0)
         low=stack.pop(0)
         index=partition(nums,low,high)
         if low<index-1:
             stack.insert(0,low,)
             stack.insert(0,index-1)
         if high>index+1:
             stack.insert(0,index+1)
             stack.insert(0,high)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值