IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【和我一起学算法】查找篇——二分法查找 -> 正文阅读

[数据结构与算法]【和我一起学算法】查找篇——二分法查找

说到二分查找,相信不少人小时候玩过猜数的游戏,在1~100之间随机挑选一个数,让别人来猜。如果别人猜错了,你要提示他猜的这个数随机数大还是比随机数小,别人继续猜,直到猜到为止。通常这个玩游戏的人都会从50开始猜,因为这样至少排除了一半不可能的数字。如果按照这个方法继续排除,在最大数为100的情况下,最多6次就能猜到这个随机数。这个猜数小游戏和二分查找的思想不谋而合。

目录

二、二分法查找

算法原理

举例

第一次查找

第二次查找

第三次查找

源码

产生随机数列

快速排序

二分法查找


二、二分法查找

算法原理

在一个有序数列里查找一个特定数列,顺序之前讲的顺序查找无疑是最没有效率的方法了。

二分查找的思想就是直接将数列中间的那个数与被查找数key相比较,如果这个数比被查找数key小,毫无疑问的就是被查找数一定在有序数列的后半部分中;否则被查找数一定在数列的前半部分。

举例

我们还是以数列iList[0,1,2,3,4,5,6,7,8,9]为例,假设被查找数是9。

第一次查找

iLsit的长度为len(iList)=10,最中间的下标元素就是数列首元素的下标0和数列尾元素的下标9的和除以2,(0+9)/2=4。iList[mid]就是iList[4],第一次比较就是和iList[4]比较,如下图所示:

?key比iList[4]大,所以key在iList[4]的后半部分。

第二次查找

后半部分的中间元素是iList[7],拿这个数和key值相比,若下图所示:

key比iList[7]要大,说明key在iList[7]的后半部分,但是此时后半部分中间元素下标是8,此时只剩下两个元素了,在使用二分查找就得不偿失了 。

第三次查找

不再使用二分法查找,直接比较这两个数和key是否相等,如果相等就返回该元素的下标,如果都不想等就返回未找到key的提示信息。如下图所示:

?同样是查找9,顺序查找要查找10次才能找到(这是顺序查找最坏的情况),但是二分查找只需要查找3次(这是二分查找最坏情况),很明显二分查找要比顺序查找效率高。

源码

产生随机数列

randomLsit.py

import random

def randomList(n):
    '''返回一个长度为n的整数列表,数据范围[0,1000) '''
    iList = []
    for i in range(n):
        iList.append(random.randrange(1000))
    return iList

if __name__ == "__main__":
    iList = randomList(10)
    print(iList)

快速排序

quickSort.py

from randomList import randomList
import timeit

iList = randomList(20)

def quickSort(iList):
    if len(iList) <= 1:
        return iList
    left = []
    right = []
    for i in iList[1:]:
        if i <= iList[0]:
            left.append(i)
        else:
            right.append(i)
    return quickSort(left) + [iList[0]] + quickSort(right)

if __name__ == "__main__":
    print(iList)
    print(quickSort(iList))
    print(timeit.timeit("quickSort(iList)", "from __main__ import quickSort,iList", number=100))

二分法查找

binarySearch.py

from randomList import randomList
from quickSort import quickSort
import random

iList = quickSort(randomList(20))

def binarySearch(iList, key):
    print("iList = %s" %str(iList))
    print("Find The number : %d" %key)
    iLen = len(iList)
    left = 0 
    right = iLen -1

    while right - left > 1:
        mid = (left + right) // 2
        if key < iList[mid]:
            right = mid
        elif key > iList[mid]:
            left = mid
        else:
            return mid
    if key == iList[left]:
        return left
    elif key == iList[right]:
        return right
    else:
        return -1

if __name__ == "__main__":
    keys = [random.choice(iList), random.randrange(min(iList), max(iList))]
    for key in keys:
        res = binarySearch(iList, key)
        if res >= 0:
            print("%d is in the list, index is : %d\n" %(key, res))
        else:
            print("%d is not in the list\n" %key)

往期文章推荐:

排序篇:

【和我一起学算法】排序篇——冒泡排序

【和我一起学算法】排序篇——选择排序?

【和我一起学算法】排序篇——插入排序?

【和我一起学算法】排序篇——归并排序?

【和我一起学算法】排序篇——快速排序?

【和我一起学算法】排序篇——计数排序?

【和我一起学算法】排序篇——总结?

查找篇:

【和我一起学算法】查找篇——顺序查找

如果喜欢这个系列的文章可以订阅我的算法设计与分析专栏,每天更新~

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 15:08:14  更:2021-10-24 15:08:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:48:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码