翻翻目录看到我能想到什么
1.分而治之2.快速排序3.再谈大O表示法
一。分而治之
分而治之又称D&C,是一种递归式解决问题的方式。将大的问题不断缩小,寻找基线条件和递归条件,从而解决问题。
二。快速排序
快速排序需要设置基准值。将数组与基准值比较,产生一个比基准值大的数组和一个比基准值小的数组。再次选择基准元素,再次产生一个比基准值大的数组和一个比基准值小的数组。直到无法产生新的数组。
时间复杂度。
快速排序的最坏情况的时间复杂度是O(n**2),平均情况是O(n log n)
三。再谈大O表示法
记不得讲了什么。
再看看书看看忘记的内容
D&C解决问题的步骤
- 找出基线条件,条件尽可能简单
- 不断将问题分解,直到符合基线条件
提示
编写涉及数组的递归函数时,基线条件通常时数组为空或只包含一个元素。
( 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))