算法导论——python实践(7.快速排序)

1、快速排序的描述快速排序是原址排序,不用新增某一序列用于存储在排序过程中的临时变量。原址排序就是在原来的数组上进行操作。主要分为两步分解:对于一个数组A[p.....r]排序,将其划分为两个子数组A[p.....q-1]和A[q+1.....r],使得A[p.....q-1]中的每一个元素都小于等于A[q],而A[q]也小于等于A[q+1.....r]中的每一个元素。此时我们就能将A...
摘要由CSDN通过智能技术生成

1、快速排序的描述

快速排序是原址排序,不用新增某一序列用于存储在排序过程中的临时变量。原址排序就是在原来的数组上进行操作。

主要分为两步

分解:对于一个数组A[p.....r]排序,将其划分为两个子数组A[p.....q-1]和A[q+1.....r],使得A[p.....q-1]中的每一个元素都小于等于A[q],而A[q]也小于等于A[q+1.....r]中的每一个元素。此时我们就能将A[q]在正确排序后的正确下标索引解出来。对应下面程序的partition函数。

解决:通过递归调用快速排序,因为上一步已经把A[q]的正确位置找出,并且左边小于等于A[q],右边严格大于A[q],只要分别对左右两边再调用快速排序算法即可。

def partition(a,p,r):
    x=a[r]
    i=p-1
    for j in range(p,r):
        if a[j]<=x:
            i+=1
            a[i],a[j]=a[j],a[i]
    a[i+1],a[r]=a[r],a[i+1]
    return i+1
def quicksort(a,p,r):
    if p<r:
        q=partition(a,p,r)
        quicksort(a,p,q-1)
        quicksort(a,q+1,r)
quicksort(a,0,len(a)-1)

关于partition函数:其主要作用将数组分成两部分,并找到A[r]的正确位置,并且将数组分为三个区域(1)若p<=k<=i,a[k]<=x.(2)若i+1<=k<=j-1,a[k]>x.(3)若k==r,a[k]=x.

2、快速排序的随机化版本

import random
def partition(a,p,r):
    x=a[r]
    i=p-1
    for j in range(p,r):
        if a[j]<=x:
            i+=1
            a[i],a[j]=a[j],a[i]
    a[i+1],a[r]=a[r],a[i+1]
    return i+1
def randomized_partition(a,p,r):
    i=random.randint(p,r)
    a[i],a[r]=a[r],a[i]
    return partition(a,p,r)
def randomized_quicksort(a,p,r):
    if p<r:
        q=randomized_partition(a,p,r)
        randomized_quicksort(a,p,q-1)
        randomized_quicksort(a,q+1,r)

randomized_quicksort(a,0,len(a)-1)

为什么要引入随机化:由于可能初始的序列存在最坏情况的可能性,通过在算法中引入随机性,从而使得算法对于所有的输入都能获得较好的期望性能。

3、快速排序分析

最坏情况分析:运行时间\Theta (n^{2})

最好情况分析:运行时间\Omega (nlgn)

期望运行时间:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值