zoukankan      html  css  js  c++  java
  • 递归与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))


  • 相关阅读:
    贪婪算法
    递归 快速排序
    递归 判断数组最大数字
    加法递归
    快速排序
    二分查找
    介绍求解AX=b:可解性与解的结构
    消元法求解线性方程组
    内容说明-线性代数
    gis
  • 原文地址:https://www.cnblogs.com/songyuejie/p/11369545.html
Copyright © 2011-2022 走看看