zoukankan      html  css  js  c++  java
  • 冒泡排序、递归、二分查找

    一、冒泡排序

    给出一个纯数字列表. 请对列表进行排序.
    思路:
    1.完成a和b的数据交换. 例如, a = 10, b = 24 交换之后, a = 24, b = 10
    2.循环列表. 判断a[i]和a[i+1]之间的大小关系, 如果a[i]比a[i+1]大. 则进行互换. 循环结束的时候. 当前列表中最大的数据就会被移动到最右端.
    3.想一想, 如果再次执行一次上面的操作. 最终第二大的数据就移动到了右端. 以此类推. 如果反复的进行执行相应的操作. 那这个列表就变成了一个有序列表.

    li=[11,9,3,6,1,5,7,32,21]
    for i in range(len(li)-1):
        for j in range(len(li)-1-i):
            if li[j]>li[j+1]:
                li[j],li[j+1]=li[j+1],li[j]
    print(li)

     二、递归

    在函数中调用函数本身. 就是递归
    def func():
      print("我是谁")
      func()
    func()
    在python中递归的深度最⼤到998
    def foo(n):
      print(n)
      n += 1
      foo(n)
    foo(1)

    import os
    def func(filepath, n): # d:/sylar/
        # 1,打开这个文件夹
        files = os.listdir(filepath)
        # 2. 拿到每一个文件名
        for file in files:  # 文件名
            # 3. 获取到路径
            f_d = os.path.join(filepath, file) # d:/sylar/文件名/
            # 4. 判断是否是文件夹
            if os.path.isdir(f_d):
                # 5. 如果是文件夹. 继续再来一遍
                print("	"*n, file,":") # 打印文件名
                func(f_d, n + 1)
            else:   #  不是文件夹. 普通文件
                print("	"*n, file)
    func("d:/sylar",0)

    三、二分查找

    循环方法查找数据

    lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789 ]
    n = 79
    for el in lst:
        if el == n: # O(1)
            print("找到了")
            break
    else:
        print("没有")

    二分法查找数据

    使用二分法可以提高效率, 前提条件:有序序列
    lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789]
    n = 88
    left = 0
    right = len(lst)-1
    
    while left <= right: # 边界, 当右边比左边还小的时候退出循环
        mid = (left + right)//2 # 必须是整除. 因为索引没有小数
        if lst[mid] > n:
            right = mid - 1
        if lst[mid] < n:
            left = mid + 1
        if lst[mid] == n:
            print("找到了这个数")
            break
    else:
        print("没有这个数")

    递归来完成二分法

    lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789]
    def func(n, left, right):
        if left <= right: # 边界
            mid = (left + right)//2
            if n > lst[mid]:
                left = mid + 1
                return func(n, left, right) # 递归  递归的入口
            elif n < lst[mid]:
                right = mid - 1
                # 深坑. 函数的返回值返回给调用者
                return func(n, left, right)    # 递归
            elif n == lst[mid]:
                print("找到了")
                return mid
                # return  # 通过return返回. 终止递归
        else:
            print("没有这个数") # 递归的出口
            return -1 # 1, 索引+ 2, 什么都不返回, None
    # 找66, 左边界:0,  右边界是:len(lst) - 1
    ret = func(70, 0, len(lst) - 1)
    print(ret) # 不是None
  • 相关阅读:
    视频聊天相关技术介绍
    block相关归纳
    block的作用
    block教程
    向appstore提交app流程
    ios xmpp 发送语音图片解决方案
    python 三元运算、列表推倒式、字典推倒式、生成器生成式
    python 生成器
    python 迭代器(第二次总结)
    python 迭代器
  • 原文地址:https://www.cnblogs.com/shanae/p/9483010.html
Copyright © 2011-2022 走看看