算法图解(四)快速排序

翻翻目录看到我能想到什么
1.分而治之2.快速排序3.再谈大O表示法
一。分而治之
分而治之又称D&C,是一种递归式解决问题的方式。将大的问题不断缩小,寻找基线条件和递归条件,从而解决问题。
二。快速排序
快速排序需要设置基准值。将数组与基准值比较,产生一个比基准值大的数组和一个比基准值小的数组。再次选择基准元素,再次产生一个比基准值大的数组和一个比基准值小的数组。直到无法产生新的数组。
时间复杂度。
快速排序的最坏情况的时间复杂度是O(n**2),平均情况是O(n log n)
三。再谈大O表示法
记不得讲了什么。
再看看书看看忘记的内容

D&C解决问题的步骤

  1. 找出基线条件,条件尽可能简单
  2. 不断将问题分解,直到符合基线条件

提示
编写涉及数组的递归函数时,基线条件通常时数组为空或只包含一个元素。

( Haskell等函数式编程语言没有循环,大量使用了递归。)

在谈大O表示法

c*n
c代表固定的时间量,n代表操作数

代码实现

1.递归的方式编写一个sum函数,计算[2,4,6]的和
2.递归的方式计算列表包含的元素数
3.找出列表中最大的数字
4.递归的方式实现二分查找
5.快速排序法

def sum (list) :
    if list == [] :
        return 0
    else :
        return list[0] + sum(list[1:])
list = [2,3,5]
print(sum(list))

def count (list) :
    if list == [] :
        return 0
    else :
        return 1+count(list[1:])
list=[2,3,5,22,56]
print(count(list))

def search (list) :
    if len(list) == 2 :
        return list[0] if list[0] > list[1] else list[1]
    sub_max = max (list[1:])
    return list[0] if list[0] > sub_max else sub_max
list=[5,6,4761,3,64,1,36,46,2,46,4761]
print(search(list))
'''
len(list)==2 当只有两个元素时开始比较,也就是基线条件
第一个return 是为了比较最后两个
第二个return 是循环条件,循环比较最后返回来的那一个值和剩下的list[0]
'''
def quicksort(list) :
    if len(list) < 2 : # 基线条件:当列表为空或者只有一个元素时
        return list
    else :
        pivot = list [0]  #选定基准值
        less = [i for i in list[1:] if i <= pivot]  #产生小列表
        greater = [i for i in list[1:] if i > pivot]   #产生大列表
        return  quicksort(less) + [pivot] + quicksort(greater)
list = [45,46,2,794,4,33,6,33,1,1]
print(quicksort(list))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值