前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法图解2-二分法和选择排序

算法图解2-二分法和选择排序

作者头像
皮大大
发布2021-03-02 15:13:50
6490
发布2021-03-02 15:13:50
举报
文章被收录于专栏:机器学习/数据可视化

二分法查找

猜数字游戏

0-1000猜数字游戏:

  • 普通查找:100,99,98,…,1,需要100步
  • 二分法查找:100--->50--->25--->13--->7--->4--->2--->1,每次猜测中间的数字(假设猜测数字是1),将余下的数字排除一半。需要7步

n个元素组成的列表,最多需要走log_2{n}步。普通查找n步

attention:二分法查找仅对有序列表有用

思想

折半查找,比较次数少,速度快,只能作用于有序数组和顺序表,当查找范围内只有一个数据的时候,结束查找。

  • 最优时间复杂度:O(1)
  • 最坏时间复杂度:O(logn)
运行时间

运行时间是通过大o()运行时间来表示

  • 二分查找的速度比线性查找快的多,元素越多,快的越多
  • 算法运行时间是从其增速的角度来度量的
Python实现
代码语言:javascript
复制
# 非递归版本

def binary_search(alist, target):   
    low = 0    # 指定需要查找的范围
    high = len(alist) - 1
    
    while low <= high:  # 查找的条件:只要范围没有缩小到只包含一个元素,就检查中间的元素
        mid = (low + high) // 2  # 定位中间的元素,需要进行取整
        guess = alist[mid]
        
        if guess == target:  # 中间的元素恰好是目标值,直接输出索引mid
            return mid  # 返回索引
        if guess > target:  # 猜测的数字太大  
            high = mid - 1  # 将高位左移,减1
        else:  
            low = mid + 1  # 猜测数字过小,地位右移1位
     
    return None


# 递归版本
def binary_search(alist, item):
    n = len(alist)
    
    if n > 0:
        mid = // 2
        guess = alist[mid]
        if guess == item:
            return True
        elif guess > item:   # 猜测过大,要左移
            return binary_search(alist[:mid], item)  # 搜索的列表左移
        elif:
            return binary_search(alist[mid+1:], item)  # 猜测过小,搜索的列表右移
        
    return False
代码语言:javascript
复制
# 线性查找

def linear_search(alist, obj):
    n = len(alist)
    
    for i range(0, n):  # 遍历循环每个元素和目标元素进行比较
        if alist[i] == obj:
            return i 
     return "{} not in the alist".format(obj)

选择排序

代码语言:javascript
复制
def findSmallest(alist):  # 找出最小的元素
    n = len(alist)
    
    smallest = alist[0]
    smallest_index = 0
    
    for i in range(1, n):  # 遍历数组中每个元素(除了第一个元素)
        if alist[i] < smallest:  # 如果数组其他的元素比第一个小,说明alist[i]更小
            smallest = alist[i]  # 赋值并且索引交换
            smallest_index = i
    return smallest_index  # 返回索引值,pop方法需要

def selectSort(arr):  # 选择排序
    newarr = []
    n = len(arr)
    
    for i in range(n):
        smallest = findSmallest(arr)  # 返回接收到的是索引
        newarr.append(arr.pop(smallest))  # pop默认删除最后一个元素,指定索引来删除元素,并且返回删除的值
    return newarr
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二分法查找
    • 猜数字游戏
      • 思想
        • 运行时间
          • Python实现
          • 选择排序
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档