Python算法入门day3——常见列表算法分析2 快速排序

【常见排序算法】

1.快速排序

【快速排序思路】

1.取一个元素p(第一个元素),使元素p归位;

2.列表被p分成两个部分,左边都比p小,右边都比p大;

3.递归完成排序

【快速排序流程】

一、首先创建一个P归位函数

步骤思路

1.将第一个元素5存起来 tmp=li[left]

2.开始循环,left=right结束循环

3.从右边找一个比五小的数放在5的下标,当左右下标碰到,则推出循环

4.再从左边找一个比五大的数放在刚才的空缺下标。 当左右下标碰到,则推出循环 

以此类推

【运行代码】

#快速排序取mid值函数
def partition(li,left,right):
    tmp=li[left] #先将左边元素存储,空出li[left]
    while right>left: #当左右相等,推出循环
        #从右往左找比tmp小的数
        while left<right and li[right]>=tmp:
            right-=1 #没找到就减一
        li[left]=li[right] #将找到的数存到空出来的左下标
        #从左往右找比tmp大的数
        while left<right and li[left]<=tmp:
            left+=1
        li[right]=li[left]
        print(li)
    li[right]=tmp #最后将mid值存入进来
    print(li)
    
    
li=[3,2,1,5,4,7,0]
print(li)
partition(li,0,len(li)-1)

【运行结果】 

[3, 2, 1, 5, 4, 7, 0]  #引入列表
[0, 2, 1, 5, 4, 7, 5] #将右边的0存入3的位置,将左边的5存入0的位置
[0, 2, 1, 5, 4, 7, 5]#此时左右下标重合
[0, 2, 1, 3, 4, 7, 5] #将重合下标改为tmp

【编写快速排序】

#快速排序取mid值函数
def partition(li,left,right):#列表、左下标、右下标
    tmp=li[left] #先将左边元素存储,空出li[left]
    while right>left: #当左右相等,推出循环
        #从右往左找比tmp小的数
        while left<right and li[right]>=tmp:
            right-=1 #没找到就减一
        li[left]=li[right] #将找到的数存到空出来的左下标
        #从左往右找比tmp大的数
        while left<right and li[left]<=tmp:
            left+=1
        li[right]=li[left]
        
    li[right]=tmp #最后将mid值存入进来
    return right

#快速排序框架
def quick_sort(data,left,right):#列表、左下标、右下标
    if left<right:
        mid = partition(data,left,right) #归位完中间值
        quick_sort(data,left,mid-1)#继续递归左边的列表
        quick_sort(data,mid+1,right)#右边的列表
    
    
li=[3,2,1,5,4,7,0]
quick_sort(li,0,len(li)-1)
print(li) #[0, 1, 2, 3, 4, 5, 7]

 【快速排序的效率】

快速排序的时间复杂度:O(nlogn) 每次递归被分成两个所以是O(logn),partition函数的复杂度是O(n)——因为从左开始撞到右,从右开始碰到左,只要循环n次就好

【快速排序的问题】

1.最坏情况 【9,8,7,6,5,4,3,2,1】倒序 速度是O[n^2]

2.递归

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值