zoukankan      html  css  js  c++  java
  • 冒泡排序;二分法;

    一.二分法查找:  

      核心: 掐头去尾取中间. 一次砍一半

      二分查找. 每次能够排除掉一半的数据. 查找的效率非常高. 但是局限性比较大. 必须是有

       序序列才可以使用二分查找


      两种算法: 常规循环, 递归循环

    # 使用二分法可以提高效率, 前提条件:有序序列
    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: # 边界
            print("哈哈")   # 计算查找了几次
            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
     # 时间复杂度最低, 空间复杂度最低, 只需找一次,缺点也明显
     lst1 = [5,6,7,8]
     lst2 = [0,0,0,0,0,0,0,0,0]
     for el in lst1:
          lst2[el] = 1
      
     if lst2[4] == 1:   # o(1)
          print('找到了')
     else:
          print("没找到")

    二.冒泡排序

    顾名思义,冒泡排序直观的意思是气泡越大冒的越快:),对应到我们的列表中就是数字最大的先选出来,然后依次进行。例如 myList = [1,4,5,0,6],比较方式为:

      相邻的两个数字先进行比较,也就是myList[0]和myList[1],发现不是">"的关系,就继续比较myList[1]和myList[2]。。。依次进行,发现myList[2]>myList[3](及5>0),就进行交换,所以走完第一次全列表比较得到新列表[1,4,0,5,6],然后每一次扫描得到的新列表如下:

      第一次:[1,4,0,5,6]

      第二次:[1,0,4,5,6]

      第三次:[0,1,4,5,6]

      第四次:[1,4,5,0,6]

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

    1 def bubbleSort(myList):
    2     #首先获取list的总长度,为之后的循环比较作准备
    3     length = len(myList)
    4     
    5     #一共进行几轮列表比较,一共是(length-1)轮
    6     for i in range(0,length-1):
    7         
    8         #每一轮的比较,注意range的变化,这里需要进行length-1-长的比较,注意-i的意义(可以减少比较已经排好序的元素)
    9         for j in range(0,length-1-i):
    10             
    11             #交换
    12             if myList[j] > myList[j+1]:
    13                 tmp = myList[j]
    14                 myList[j]=myList[j+1]
    15                 myList[j+1] = tmp
    16                 
    17         #打印每一轮交换后的列表       
    18         for item in myList:
    19             print(item)
    20         print("=============================")
    21 
    22 print("Bubble Sort: ")
    23 myList = [1,4,5,0,6]
    24 bubbleSort(myList)
     
  • 相关阅读:
    org.apache.xerces.dom.ElementNSImpl.setUserData(Ljava/lang/String;Ljava/lang
    case when then 中判断null的方法
    Oracle 傻瓜式数据归档
    Object type TYPE failed to create with error
    导出表结构到Excel 生成代码用
    Intellij 高亮显示与选中字符串相同的内容
    自定义命令杀死 java 进程 alias kjava
    R语言包_dplyr_1
    dplyr包
    在天河二号上对比Julia,Python和R语言
  • 原文地址:https://www.cnblogs.com/zwq-/p/9482428.html
Copyright © 2011-2022 走看看