2019.9.25-二分查找代码(递归和非递归方法)

# coding:utf-8
#[17, 20, 26, 31, 44, 54, 55, 77, 93]
#mid = n/2
#
#[17, 20, 26, 31]
#mid = n/2

def binary_search(alist, item):
"""二分查找,遞歸"""
n = len(alist)
if n > 0:
mid = n//2
if alist[mid] == item:
return True
elif item < alist[mid]:
return binary_search(alist[:mid], item)
else:
return binary_search(alist[mid+1:], item)
return False

def binary_search_2(alist, item):
"""二分查找,非遞歸"""
n = len(alist)
first = 0
last = n-1
while first <= last:
mid = (first + last)//2
if alist[mid] == item:
return True
elif item < alist[mid]:
last = mid -1
else:
first = mid + 1
return False

if __name__ == "__main__":
li = [17, 20, 26, 31, 44, 54, 55, 77, 93]
print(binary_search(li, 55))
print(binary_search(li, 100))
print(binary_search_2(li, 55))
print(binary_search_2(li, 100))

执行结果

原文地址:https://www.cnblogs.com/lishuide/p/11587990.html

时间: 2024-07-30 20:01:23

2019.9.25-二分查找代码(递归和非递归方法)的相关文章

二分查找的递归与非递归算法

/* 二分查找的递归与非递归算法 */ #include <iostream> #include <cstdio> using namespace std; bool bisrch( int low,int high,int v,int *text ) //递归写法 { int i,mid; mid=( low+high )/2; if( low>high ) return false; if( v==text[mid] ) return true; else if( v&l

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

递归的二分查找: 1 int search(int *a, int target, int p, int r) 2 { 3 if (p <= r) 4 { 5 int mid; 6 7 mid = (p + r) / 2; 8 if (*(a + mid) == target) 9 return 1; 10 else if (*(a + mid) > target) 11 return search(a, target, p, mid - 1); 12 else 13 return searc

二分查找的递归和非递归写法

一.概述 二分查找是针对有序数列的,对无序数列是无效的,在有序序列中使用二分查找能大大提高查找效率,通常能将时间按复杂度从O(n)降至O(logn). 二.查找某数的位置(或存在性) 递归: 1 //返回"-1"表示为找到 2 //否则返回目标的下标(若有多个,只是其中一个) 3 int binary_searchs(int *arr, int target, int l, int r) 4 { 5 if (l > r) return -1; 6 int mid = (l + r

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

当然前提是:有序数列,这里以升序为例! public class binarySearch { public static void main(String[] args) { int arr[]={1,2,3,4,5,6,7,8,9}; int key=9; //int result=binarySearchMethod_noDiGui(arr,key);//非递归实现 int result=binarySearchMethod_DiGui(arr,0,arr.length-1,key);//

层次遍历递归和非递归方法

层次遍历递归和非递归方法 如何遍历一棵树 有两种通用的遍历树的策略: 深度优先搜索(DFS) 在这个策略中,我们采用深度作为优先级,以便从跟开始一直到达某个确定的叶子,然后再返回根到达另一个分支. 深度优先搜索策略又可以根据根节点.左孩子和右孩子的相对顺序被细分为先序遍历,中序遍历和后序遍历. 宽度优先搜索(BFS) 我们按照高度顺序一层一层的访问整棵树,高层次的节点将会比低层次的节点先被访问到. 下图中的顶点按照访问的顺序编号,按照 1-2-3-4-5 的顺序来比较不同的策略. 层次遍历可以采

(续)二分查找(不用递归)

接着上一篇,其实不用递归进行二分查找也很简单,当时咋就没想起来呢.. OK废话少说, show me the code 1 #include <stdio.h> 2 3 int binary_search_no_recursion(int a[], int left, int right, int key){ 4 while(left<=right){ //attention!!! 5 int mid = (left+right)/2; 6 if(key > a[mid]) 7 l

二分查找算法(递归,循环)

二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:    1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,    2.寻找{6, 7, 8, 9}的中位数,为7,7>6,

图的深度优先搜索(DFS)简介与实现(递归与非递归方法)

上一篇刚刚学习了C++图的实现,今天对深度优先搜索(DFS)进行了一定学习,并作出一定实现.在本文中图的实现,以及相应的函数调用(如获得第一个邻接顶点.获得下一个邻接顶点等)均是基于上文中的实现,故如果想参考测试代码,还需导入上文中相应的类定义.关于C++图的实现可参考此处,这里实现了对图的邻接表以及邻接矩阵两种实现,而本文的深度优先搜索对于上面两种实现均是可行的. 当然,对于图的深度优先搜索的相关定义,本文也不再过多赘述,维基的解释应该就足够,下面将探讨其实现. 1.深度优先搜索的非递归实现:

学习笔记:二分法查找的递归和非递归两种算法

首先是非递归查找函数: 1 int BinarySearch(PTABLE table,int numb){ 2 int Left,Right,Mid,ERROR=-1; 3 Left=0; 4 right=table->Lenth-1; 5 while(right>=Left){ 6 mid=(Right+Left)/2; 7 if(table->data[mid]>numb) 8 Right=mid-1; 9 else if(table->data[mid]<num