冒泡排序;二分法;

 

一.二分法查找:  

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

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

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


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

# 使用二分法可以提高效率, 前提条件:有序序列
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)

 

 

 

 

 

 

 

 

 

 

 

posted @ 2018-08-30 17:28  清风_Z  阅读(395)  评论(0编辑  收藏  举报