Python实例篇1-python实现二分法

一.二分法概述

[一维数组,折半查找]

假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个[变量]front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2.

  1. 开始令front=0(指向3),end=7(指向88),则mid=3(指向36)。因为a[mid]>x,故应在前半段中查找。

  2. 令新的end=mid-1=2,而front=0不变,则新的mid=1。此时x>a[mid],故确定应在后半段中查找。

  3. 令新的front=mid+1=2,而end=2不变,则新的mid=2,此时a[mid]=x,查找成功。

如果要查找的数不是数列中的数,例如x=25,当第三次判断时,x>a[mid],按以上规律,令front=mid+1,即front=3,出现front>end的情况,表示查找不成功。

例:在有序的有N个元素的数组中查找用户输进去的数据x。

算法如下:

  1. 确定查找范围front=0,end=N-1,计算中项mid=(front+end)/2。

  2. 若a[mid]=x或front>=end,则结束查找;否则,向下继续。

  3. 若a[mid]<x,说明待查找的元素值只可能在比中项元素大的范围内,则把mid+1的值赋给front,并重新计算mid,转去执行步骤2;若a[mid]>x,说明待查找的元素值只可能在比中项元素小的范围内,则把mid-1的值赋给end,并重新计算mid,转去执行步骤2。

二.Python实现二分法

代码:

import math

list1 = [1,2,3,4,5,6,7,8,9,10]

def finddata(d1):
    list_index_min = 0
    list_index_max = len(list1) - 1

    while list_index_min <= list_index_max:
        list_index_middle = (list_index_min + list_index_max) / 2
        list_index_middle = math.ceil(list_index_middle)
        print(list1[list_index_middle])
        print("list_index_min :" + str(list_index_min))
        print("list_index_max :" + str(list_index_max))
        print("list_index_middle :" + str(list_index_middle))

        if list1[list_index_middle] < d1:
            list_index_min = list_index_middle + 1
        elif list1[list_index_middle] > d1:
            list_index_max = list_index_middle - 1
        else:
            print("find data success! " + str(list1[list_index_middle])  + "\n" )
            break

def erfenfa(d1):
    """递归实现二分法"""



if __name__ == '__main__':
    print("第一次查找:")
    finddata(5)

    print("第二次查找:")
    finddata(4)

    print("第三次查找:")
    finddata(3)

    print("第四次查找:")
    finddata(2)

    print("第五次查找:")
    finddata(1)

测试记录:

C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe E:/additionalCode/utilities/test1.py
第一次查找:
6
list_index_min :0
list_index_max :9
list_index_middle :5
3
list_index_min :0
list_index_max :4
list_index_middle :2
5
list_index_min :3
list_index_max :4
list_index_middle :4
find data success! 5

第二次查找:
6
list_index_min :0
list_index_max :9
list_index_middle :5
3
list_index_min :0
list_index_max :4
list_index_middle :2
5
list_index_min :3
list_index_max :4
list_index_middle :4
4
list_index_min :3
list_index_max :3
list_index_middle :3
find data success! 4

第三次查找:
6
list_index_min :0
list_index_max :9
list_index_middle :5
3
list_index_min :0
list_index_max :4
list_index_middle :2
find data success! 3

第四次查找:
6
list_index_min :0
list_index_max :9
list_index_middle :5
3
list_index_min :0
list_index_max :4
list_index_middle :2
2
list_index_min :0
list_index_max :1
list_index_middle :1
find data success! 2

第五次查找:
6
list_index_min :0
list_index_max :9
list_index_middle :5
3
list_index_min :0
list_index_max :4
list_index_middle :2
2
list_index_min :0
list_index_max :1
list_index_middle :1
1
list_index_min :0
list_index_max :0
list_index_middle :0
find data success! 1


Process finished with exit code 0

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java 实现二分法查找算法 算法 假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可...
    康熙微博私访记阅读 10,365评论 0 8
  • 先玩一个小游戏。预先给定一个小于100的正整数x,让你猜,猜测过程中给予大小判断的提示,问你怎样快速地猜出来? 这...
    _hider阅读 4,801评论 0 2
  • 链表: 无意间发现的一个面试总结感觉不错 剑指offer习题总结 链表是一种动态数据结构,他的特点是用一组任意的存...
    灿烂的GL阅读 6,345评论 0 1
  • 原理: 1.确定查找范围front=0,end=N-1,计算中项mid=(front+end)/2。 2.若a[m...
    进击的PHPer阅读 728评论 0 0
  • 二分法查找效率高,其查找次数与总元素数量存在对数关系 原理在进行二分法查找前需要先对数据进行排序(具体排序实现详见...
    Spike_Spiegel阅读 3,165评论 0 0