二分查找

二分查找(递归和非递归)

[亡魂溺海] 提交于 2019-11-27 07:21:52
二分算法步骤描述 前提:有序数组中查找关键词所在的位置 ① 首先确定整个查找区间的中间位置 mid = strat+(end-strat)/2 ② 用待查关键字key值与中间位置的关键字值进行比较; 若相等,则查找成功 若大于,则在后(右)半个区域继续进行折半查找 若小于,则在前(左)半个区域继续进行折半查找 ③ 对确定的缩小区域再按折半公式,重复上述步骤。 一、非递归二分查找算法(用while循环判断) public static int search(int key,int[] arr){ int start=0; int end=arr.length-1; while(start<=end){ int mid=start+(end-start)/2; if(key<arr[mid]){ end=mid-1; }else if(key>arr[mid]){ start=mid+1; }else{ return mid; } } return -1; } 二、递归二分查找算法 public static int search2(int key,int[] arr,int start,int end){ if(start >end){ return -1; } int mid=start+(end-start)/2; if(key<arr[mid]){ return search2

二分查找

核能气质少年 提交于 2019-11-27 05:31:00
#二分查询 #有序列表 from asyncio.log import logger def binary_search(arr,find): ''' :param arr: :param find: :return: ''' first = 0 lasted = len(arr) - 1 while first <= lasted: mid = (first+lasted)//2 if arr[mid] == find: logger.debug("在mid处找到") return mid elif arr[mid] > find: lasted = mid-1 elif arr[mid] < find: first = mid+1 else: return -1 if __name__ == '__main__': arr_list = [1,3,7,9,99,101] find = int(input("请输入一个数字,查找是否在列表中")) res = binary_search(arr_list,find) print(res) 来源: https://blog.csdn.net/chuanying_xiaoqi/article/details/99456684

Task 3:排序 + 二分查找 (3天)

随声附和 提交于 2019-11-27 03:45:48
一、 【排序】 实现归并排序、快速排序、插入排序、冒泡排序、选择排序、堆排序(完成leetcode上的返回滑动窗口中的最大值(239),这是上一期第三天的任务进行保留(涉及队列可以对第二天进行整理复习)) 归并排序: def merge(a, b): c = [] h = j = 0 while j < len(a) and h < len(b): if a[j] < b[h]: c.append(a[j]) j += 1 else: c.append(b[h]) h += 1 if j == len(a): for i in b[h:]: c.append(i) else: for i in a[j:]: c.append(i) return c def merge_sort(lists): if len(lists) <= 1: return lists middle = len(lists)/2 left = merge_sort(lists[:middle]) right = merge_sort(lists[middle:]) return merge(left, right) if __name__ == '__main__': a = [4, 7, 8, 3, 5, 9] print merge_sort(a) 快速排序: data = [45,3,2,6,3,78

数据--第51课 - 二叉排序树

和自甴很熟 提交于 2019-11-27 00:07:30
第51课 - 二叉排序树 1. 二分查找的回顾 (1)二分查找的特点 二分查找能够提高有序表中数据元素的查找速度。 二分查找的时间复杂度为O(log 2 n)。 二分查找是一种静态查找。 (2)二分查找的不足 当查找表经常变化时,二分查找的整体性能急剧下降。 2. 二分查找的硬伤 二分查找基于有序表。 当需要插入或者删除数据元素时,为了能够继续进行二分查找,需要大规模挪动有序表中的数据元素,使得插入或者删除后的线性表保持有序。 3. 二分查找的过程 二分查找的过程是一棵二叉树! 特点: 任意一个结点的值都大于其左子树的所有结点值。 任意一个结点的值都小于其右子树的所有结点值。 4. 新的想法 直接组织一棵具有二分查找特性的二叉树。二分查找过程即变换为对树结点的查找过程,由二分查找的特性可知树结点查找的时间复杂度为O(log 2 n),只在叶结点处插入新结点即可保持特性不变,删除树结点时也可以容易的保持特性不变 5. 二叉排序树 二叉排序树是一棵空树,或者若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左右子树也分别是二叉排序树。 插入:其插入操作总是在叶结点处进行。 删除:叶结点:直接删除;非叶结点:查找合适的替代者后删除。 如何为删除操作查找合适的替代者? 有一个孩子的结点:用孩子结点代替原结点。

python-二分查找

耗尽温柔 提交于 2019-11-26 10:29:20
1.while循环实现 li = [1,4,6,8,9,10,15,18] left = 0 right = len(li)-1 n = 99 while 1: if left<right: mid = (left+right)//2 if n>li[mid]: left = mid + 1 if n <li[mid]: right = mid-1 if n==li[mid]: print("找到了") break else: print("找不到") break 2.递归实现 li = [1,4,6,8,9,10,15,18] def func(n,left,right): if left<=right: mid = (left+right)//2 if n<li[mid]: right = mid-1 return func(n,left,right) # 但你用了递归后要返回一个值,前面的所有都要返回,不然是返回不到的 if n>li[mid]: left = mid + 1 return func(n,left,right) if n==li[mid]: print("找到了") return mid # 返回索引 else: print("找不到") return -1 a =func(4,0,len(li)-1) print(a) 3.另类方法实现,缺点

二分查找-POJ3579-Median

被刻印的时光 ゝ 提交于 2019-11-26 06:12:06
题目大意 给定一个长度为n的正整数序列a[],现有a[]中的所有元素任意两两做差,形成一个长度为 C n 2 C_n^2 C n 2 ​ 的序列b[],求出b[]的中位数。 其中,1<=n<= 1e5 , 0<a[i]< 1e9 问题分析 直接求出这些差值、排列、选中位数,显然会超时,其时间复杂度为 O(n^2 log n^2) ,其中求值为O(n^2), 排列为O(m log m)。 二分查找的框架中,查找结果为 符合check()条件的第一个位置 while ( l < r ) { int mid = l + ( r - l ) / 2 ; if ( check ( mid ) ) //大于dif的数少于等于一半 ---------------+---- r = mid ; else l = mid + 1 ; } 中位数的直观定义为数列中 最中间的数 ,准确定来说就是数列 排序后位置在最中间 (当n为奇数时,中间为n/2+1,;当n为偶数时,中间为n/2<题目中定义>),换言之,也就是说,大于中位数的数占一半,小于中位数的数也占一半。但这样不够精准,因为 可能和中位数相等的数有很多个 。准确定义,应该是 大于中位数的数应少于等于总数的一半 数列a[] 中位数mid 大于mid的数量 1 2 3* 4 5 3* 2 1 2* 2 2 3 2* 1 1 2* 2 3 4 2* 2

二分查找-POJ1064-Cable Master

这一生的挚爱 提交于 2019-11-26 06:11:09
题目大意 给定n条绳子的长度a[],如果从它们中切割出k条长度相同为ans的绳子,则ans最大能是多少(给定的绳子长和答案均 保留两位小数 ) 1<=n,k<=1e5 1<=a[i]<=1e6 问题分析 问题的本质寻找可行解的上界,这与二分搜索的思想高度契合:在 有序 的一组解中利用二分不断 缩小可能解的范围 ,直至答案在 可接受的精度内 ,可以 寻找可行解的上界和下界 。 当解为浮点数时,注意模板写法上与整数的区别 二分查找得到的总是 满足判断条件的第一个解 ,即可行解的 下界 。为了得到可行解的上界,我们可以先求的不可行解的下界,这个不可行解下界的前一个,就是可行解的上界。因此我们可以在判断时做一下 逻辑反转 ,使得求上下界的代码更加统一。严谨地看,这里 隐含 了一个前提: 可行解与不可行解总是将值域分为两个连续的区域 ,即解的分布为(a)或(b),而不为©或(d)。事实上,很多问题都满足这样的分布,但在如上的逻辑反转操作中,最好还是确定一下分布条件是否成立。 --------------++++++++ +++++++++++++±------- --------++++++±------ +++++++±------ +++++++ 左边界l变化时, 变化量应为eps 而非1。 当获取结果时,注意与整数解的区别。对于整数解来说, 上界解应该为ans=r-1 。但对于浮点数解

算法基础 顺序查找 二分查找

不问归期 提交于 2019-11-26 00:26:40
1 #顺序查找即在给定范围内逐个遍历,查找需要的数据直到找到或者退出,适合任何类型的查找对象。复杂度为O(n)下面一列表为例,展示顺序查找算法 2 list1 = [i for i in range(100)] #使用列表生成式,生成一个0~99的步长为1列表。 3 find_num = int(input("inpute you want find num")) 4 for i in range(len(list1)): 5 if find_num == list1[i]: 6 print("num index is %d"%i) 7 break 8 print("the num not in list") 9 10 #二分查找。二分查找适合查找对象已完成排序,复杂度为O(log n)还是以list1作为查找对象,假设列表按照升序排列 11 def Find_Num(num, list1): 12 low = 0 13 top = len(list1) - 1 14 if len(list1) == 0: 15 print("list is null") 16 exit() 17 while low <= top: 18 task = int((low + top)/2) 19 guess = list1[task] 20 if num == list1[task]: 21