zoukankan      html  css  js  c++  java
  • 数据结构之冒泡排序,递归,二分法

    一丶冒泡排序:

      1.概念:

        顾名思义,冒泡排序方式就跟气泡一样,一层一层的往上冒,气泡越大数值越小,当遇到比自己小的气泡,就升到此气泡上面,逐渐比较.

      2.算法原理:

        冒泡排序算法的运作如下:(从后往前)

          >比较相邻的元素。如果第一个比第二个大,就交换他们两个

          >对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

          >针对所有的元素重复以上的步骤,除了最后一个。

          >持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

     代码如下:

    #冒泡排序
    lst1 = [6,5,4,3,2,1]
    def bubble(lst):
        #首先获取lst的总长度,为之后的循环比较作准备
        length = len(lst)
        #一共进行几轮比较,因为下标从零开始,所以一共需要进行length-1轮比较
        for i in range(0,length-1):
            #一共进行几轮比较,注意range的变化,length-1-i是可以减少跟那些已经排好序的数的比较
            for j in range(0,length-1-i):
                #比较
                if lst[j] > lst[j+1]:
                    #两数交换位置
                    lst[j],lst[j+1] = lst[j+1],lst[j]
            #打印每次交换后的结果
            print(lst)
            print("=======================================")
    print("bubble sort")
    bubble(lst1)

    时间复杂度:O(n^2).  需要进行的比较次数为第一轮 n-1,n-2....1, 总的比较次数为 n*(n-1)/2

    二丶递归

      在函数中调用本身就是递归,递归深度最高可达1000,但到998就会报错

    count = 1
    def func():
        global count
        print("我是大帅哥", count)
        count = count + 1
        func()
    func()

      递归应用:我们可以使用递归来遍历各种树形结构,比如我们的文件夹系统,可以使用递归来遍历该文件夹下所有文件

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

     三丶二分法查找

      二分法查找每次都能排除一半的数据,查找效率非常高,但是局限性较大,必须是有序序列才可以使用二分法查找

    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) #递归
            else:
                print("找到了")
                return "下标为%s"% mid #通过return返回. 终止递归
        else:
            print("没有这个数")  #递归的出口
            return -1
    print(func(99,0,len(lst)-1))

    另附一个最快查找方法:

    # 时间复杂度最低, 空间复杂度最低
    lst1 = [5, 6, 7, 8]
    lst2 = [0, 0, 0, 0, 0, 0, 0, 0, 0]
    for el in lst1:
        lst2[el] = 1
    print(lst2[6])

    lst1中最大的数是多少.lst2中就有多少个数,全为0,然后循环lst1,将其中的数在lst2中变为1,查找时如果返回值为1则代表存在这个数,如果为0则不存在,时间复杂度为O(1)

  • 相关阅读:
    VC++ 之 文件操作
    Delphi7 API(5) 消息篇:WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE
    VC++ 之 输入/输出类库(二)
    VB 访问控制面板
    Delphi7 API(4) 消息_重绘
    Lisp简明教程
    一次快速排序错误引发的思考(2)
    一次快速排序错误引发的思考(1)
    Common Lisp编译程序的小技巧
    暴风影音5免去广告的小技巧
  • 原文地址:https://www.cnblogs.com/qicun/p/9482561.html
Copyright © 2011-2022 走看看