• 递归与D&C思想 快速排序


    递归函数的两个条件:

    1.基线条件:函数不 再调用自己;

    2.递归条件:函数调用自己;

    分而治之(divide and conquer,D&C)是一种通用的问题解决方法;

    D&C是递归的。使用D&C解决问题的过程的两个步骤:

    1.找出基线条件,这种条件必须尽可能简单;

    2.不断将问题分解(或者说缩小规模),直到符合基线条件;

    涉及数组(列表)的递归函数 时,基线条件通常是数组 为 空,或者只包含一个元素;注意检查基线 条件。

    使用递归求和:

    def my_sum(arr):
    if arr == []:
    return 0
    else:
    return arr[0] + sum(arr[1:])


    if __name__ == '__main__':

    arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    print(my_sum(arr))
    二分查找的基线条件是数组中只包含一个元素,如果要查找的值与这个元素相同,就找到,否则,就 说明他不在数组中;
    二分查找的递归条件中,把数组分成两半,将其中一半丢掉,并对另一半执行二分查找;
    快速排序也使用了D&C的思想:
    快速排序的思想:
    1.从数组中选择一个元素,也就是基准值;

    2.将数组分成两个子数组,小于基准值的元素组成的子数组和大于基准值的元素组成的子数组;(找出比基准值小的元素以及比基准值大的元素;--也称为分区)
    3.对这两个子数组进行快速排序(得到了两个无序的子数组,如果这两个子数组是有序的,只需要将两个子数组与基准值合并即可;
    如果两个子数组是无序的,只需要对这两个子数组进行快速排序,再合并结果即可;)
    def quicksort(arr):
    if len(arr) < 2:
    return arr
    else:
    base = arr[0]
    lesser = [i for i in arr[1:] if i <= base]
    greater = [i for i in arr[1:] if i > base]
    return quicksort(lesser) + [base] + quicksort(greater)


    if __name__ == '__main__':
    li = [9, 1, 16, 55, 33, 10, 100]
    print(quicksort(li))


  • 相关阅读:
    极客mysql01
    Mysql之存储过程与存储函数
    MySQL视图详细介绍
    mysql 触发器的创建和使用
    分治 315. 计算右侧小于当前元素的个数
    128. 最长连续序列
    MySQL慢查询开启、日志分析(转)
    如何在Linux服务器上安装MariaDB或MySQL?
    如何重设MySQL的root密码
    如何修复docker-machine: command not found error
  • 原文地址:https://www.cnblogs.com/songyuejie/p/11369545.html
Copyright © 2020-2023  润新知