【日更Day 4】递归算法与快速排序

问题描述:寻找数组中的最大数字:

# 寻找数组中的最大值,这个写法真的可以啊
def find_max(arr):

    # 先找基线条件
    if len(arr) == 0:
        return -1
    if len(arr) == 1:
        return arr[0]

    # 缩小问题规模
    else:
        return max(arr[0],find_max(arr[1:]))
    
arr = [1,4,2,3,7,9,11]
res = find_max(arr)
print(res)

这个用分而治之真的可以哦!

记住两个基本要求:

  • 基线条件
  • 缩小问题规模

对于数组而言,一般基线条件就是为空数组和数组只有一个元素的情况。

然后重点关注如何缩小问题规模:思想是,拿出第一个元素,然后剩下的元素再去递归,这样问题就规模小了一点哦~~

只有自己能够运用这种思维方法来实现代码,才算真的理解了递归,并掌握了递归。

下面再思考一下快速排序算法:

首先把代码放这里:

    def quicksort(array):
        if len(array) < 2:
            return array
        else:
            pivot = array[0] # 选择基准值
            less = [i for i in array[1:] if i <= pivot] # 左边的子数组
            greater = [i for i in array[1:] if i > pivot] # 右边的子数组
    
            return quicksort(less) + [pivot] + quicksort(greater)
    
    print(quicksort([10,5,2,3]))

思考:

仍然是从递归的基础思想出发:

  • 设置基线条件
  • 缩小问题规模

快排的思路是选出pivot,然后把数组一分为二,再分别对子数组进行快速排序。

等到数组只剩下一个或者为空时,就到达基线条件。栈开始回退。

从归纳证明的角度来看,分成两步走:

  • 基线条件
  • 归纳条件

基线条件下,这种算法对于空数组或者包含一个数组有用。

归纳条件下,如果能够证明快排对包含一个元素的数组管用,对包含两个元素的数组也将管用;

对包含两个元素的数组管用,对包含三个元素的数组也将管用;以此类推。

归纳证明和D&C协同发生作用。

END.

你可能感兴趣的:(【日更Day 4】递归算法与快速排序)