python-二分查找错误示范

# !/use/bin/env python# -*-conding:utf-8-*-

# author:shanshan

"""二分查找原理:1,必须要是排序后的2,通过查找中间位置得数,是否与之相等    相等-->即为该数字    查找的数字小于中间位置的数 --->那么值肯定在左侧,就需要从左侧到此中间值 继续查找    查找的数字小于中间位置的数 --->那么值肯定在右侧,就需要从有此中间值到右侧 继续查找"""a = [1, 3, 4, 6, 7, 8, 9, 11, 15, 17, 19, 21, 22, 25, 29, 33, 38, 69, 107]""

# print(len(a))  # 19

def erfen(search_num, iter_list):  # 错误算法    start_index = 0    end_index = len(iter_list) - 1  # 18    mid = (start_index + end_index) // 2  # 9 取整,而不能用/    print(mid, iter_list[mid])    if start_index < end_index:        if search_num < iter_list[mid]:            print(‘中间值:{}‘.format(iter_list[mid]))            # iter_mid = iter_list[:mid]            print(‘向左边查找{}‘.format(iter_list[:mid]))  # 每次你的查找都在新的一个列表中进行查找,随之mid的值并不是原来列表的值了,            erfen(search_num, iter_list[:mid])        elif search_num > iter_list[mid]:            print(‘中间值:{}‘.format(iter_list[mid]))            # iter_mid = iter_list[mid:]            print(‘向右边边查找{}‘.format(iter_list[:mid]))            erfen(search_num, iter_list[:mid])        else:            return mid    else:        return ‘填错了,重来‘

# print(erfen(9, a))

def binary_search(start, end, n, d_list):    """    正确递归方式 ,每次改变开始和结束的位置但是列表还是以前的列表    :param start: 开始位置(左侧位置)    :param end: 结束位置(右侧位置)    :param n: 查找的数字    :param d_list: 列表or元祖    :return: 返回查找到数字的index或者没有查找到返回-1    """    if start < end:        mid = (start + end) // 2        if d_list[mid] == n:            print(mid)        elif n < d_list[mid]:  # 小于中间的值要从左侧查找,此时end应为mid,而不是d_list[mid]            print(‘{}小于中间的值{},开始从左侧查找‘.format(n, d_list[mid]))            print(‘查找范围:{}‘.format(d_list[start:mid]))            binary_search(start, mid, n, d_list)  # 只需要更换开始位置和结束位置就可以了        else:  # 大于中间的值要从右侧查找,此时start值应为mid  而不是d_list[mid]            print(‘{}大于中间的值{},开始从右侧查找‘.format(n, d_list[mid]))            print(‘查找范围:{}‘.format(d_list[mid:end]))            binary_search(mid, end, n, d_list)  # 只需要更换开始位置和结束位置就可以了    else:        return -1  # 代表该数字并不在此列表中

# print(binary_search(0, len(a), 9, a))

def erfen2(d_list, search_num):    left = 0    right = len(a)    while left <= right:        mid = (right + left) // 2        if search_num > d_list[mid]:            left = mid        elif search_num < d_list[mid]:            right = mid        else:            print(mid)            break

erfen2(a, 9)

原文地址:https://www.cnblogs.com/shanshan-test/p/12634491.html

时间: 2024-10-30 03:40:55

python-二分查找错误示范的相关文章

python二分查找模块bisect

bisect模块用于二分查找,非常方便. Bisect模块提供的函数有: (1)查找 bisect.bisect_left(a,x, lo=0, hi=len(a)) : 查找在有序列表a中插入x的index.lo和hi用于指定列表的区间,默认是使用整个列表. bisect.bisect_right(a,x, lo=0, hi=len(a)) bisect.bisect(a, x,lo=0, hi=len(a)) 这2个和bisect_left类似,但如果x已经存在,在其右边插入. (2)插入

Python —— 二分查找

二分查找: l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] def func(l,aim,start= 0,end=None): if end == None:end = len(l) - 1 if start <= end: mid = (end + start) // 2 #12 18 if l[mid] < aim: return func(l,aim,start = mid +

两种方法实现Python二分查找算法

一. arr=[1,3,6,9,10,20,30] def findnumber(l,h,number): mid=(l+h)//2 if arr[mid]==number: print("找到了"+str(mid)) elif arr[mid]<number: l = mid return findnumber(mid+1,h,number) elif arr[mid]>number: h = mid return findnumber(0,mid-1,number) e

Python 二分查找算法

一.解释 二分法:可以理解为折半查找法,每一次都是基于上一次的折半查找 二.实例 l = [1,2,5,7,10,31,44,47,56,99,102,130,240] #l为查找的列表 #num要查找的数 def binary_search(l,num): print(l) #[10, 31] if len(l) > 1: mid_index=len(l)//2 #1 if num > l[mid_index]: #in the right l=l[mid_index:] #l=[31] b

Python 二分查找

def search(data_set,find_num):    mid = len(data_set) /2    print mid    if len(data_set) == 1:       if data_set[mid] == find_num:        print ('End start: ',find_num)        return        else:        print ('NO NO NO:',find_num)        return   

python二分查找问题set

leetcode34 Search for a Range class Solution: def searchRange(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ if not nums: return [-1, -1] def search(n): st = 0 ed = len(nums) - 1 while

二分查找&mdash;&mdash;Python实现

一.排序思想 二分(折半)查找思想请参见:https://www.cnblogs.com/luomeng/p/10585291.html 二.python实现 def binarySearchDemo(arr, key): """ python二分查找非递归方式 :param arr:待排序列,有序集合 :param key:带查找元素 """ low = 0 high = len(arr) - 1 while low <= high: m

python算法之二分查找

说明:大部分代码是在网上找到的,好几个代码思路总结出来的 通常写算法,习惯用C语言写,显得思路清晰.可是假设一旦把思路确定下来,并且又不想打草稿.想高速写下来看看效果,还是python写的比較快.也看个人爱好.实习的时候有个同事对于python的缩进来控制代码块各种喷....他认为还是用大括号合适...怎么说呢,适合自己的才是最好的.我个人的毛病就是,写了几天C,到要转到python的时候,代码中依旧有C的影子..比方大括号问题,比方忘记在while或这for.if.else等后面加":&quo

python函数:递归函数及二分查找算法

本文和大家分享的主要是python的递归函数及二分查找算法相关内容,一起来看看吧,希望对大家学习python有所帮助. 一.递归的定义 def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? """ print(s) story() story() 老和尚讲故事 递归的定义 -- 在一个函数里再调用这个函数本身.这种魔性的使用函数的方式就叫做 递归 . 递归的最大深度:997 1.python递归最大层