zoukankan      html  css  js  c++  java
  • 二分查找及几种变体的Python实现

    1. 在不重复的有序数组中,查找等于给定值的元素

    循环法

    def search(lst, target):
    	n = len(lst)
    	if n == 0:
    		return -1
    	
    	low = 0
    	high = n - 1
    	while low <= high:
    		mid = (high-low)//2 + low
    		if lst[mid] == target:
    			return mid
    		elif lst[mid] < target:
    			low = mid +1
    		elif lst[mid] > target:
    			high = mid -1
    	return -1
    

    递归法

    def search2(lst, target, low, high):
    	if low > high:
    		return -1
    	
    	mid = (high-low)//2 + low
    	if lst[mid] == target:
    		return mid
    	elif lst[mid] < target:
    		return search2(lst, target, mid+1, high)
    	elif lst[mid] > target:
    		return search2(lst, target, low, mid-1)
    

    2. 查找第一个值等于给定值的元素

    def bsearch(lst, value):
    	n = len(lst)
    	if n == 0:
    		return -1
    	low = 0
    	high = n - 1
    	while low <= high:
    		mid = (high-low) // 2 + low
    		if lst[mid] < value:
    			low = mid + 1
    		elif lst[mid] > value:
    			low = mid - 1
    		elif lst[mid] == value:
    			if mid == 0 or lst[mid-1] != value:
    				return mid
    			else:
    				high = mid - 1
    	return -1
    

    3. 查找最后一个值等于给定值的元素

    def bsearch(lst, value):
    	n = len(lst)
    	if n == 0:
    		return -1
    	low = 0
    	high = n - 1
    	while low <= high:
    		mid = (high-low) // 2 + low
    		if lst[mid] > value:
    			high = mid - 1
    		elif lst[mid] < value:
    			low = mid + 1
    		elif lst[mid] == value:
    			if mid == n-1 or lst[mid+1] != value:
    				return mid
    			else:
    				low = mid + 1
    	return -1
    

    4. 查找第一个大于等于给定值的元素

    def bsearch(lst, value):
    	n = len(lst)
    	if n == 0:
    		return -1
    	low = 0
    	high = n - 1
    	while low <= high:
    		mid = (high-low) // 2 + low
    		if lst[mid] < value:
    			low = mid + 1
    		elif lst[mid] >=value:
    			if mid == 0 or lst[mid-1] < value:
    				return mid
    			high = mid - 1
    

    5. 查找最后一个小于等于给定值的元素

    def bsearch(lst, value):
    	n = len(lst)
    	if n == 0:
    		return -1
    	low = 0
    	high = n - 1
    	while low <= high:
    		mid = (high-low) // 2 + low
    		if lst[mid] > value:
    			high = mid - 1
    		elif lst[mid] <= value:
    			if mid == n-1 or lst[mid+1] > 0:
    				return mid
    			low = mid + 1
    	return -1
    
  • 相关阅读:
    用折半查找法找出整型数组中指定元素所在的位置,并输出(折半查找法只能用于有序数列)。
    统计母字符串中含有子串的个数。
    //插入排序法对数组中的元素按从小到大进行排序
    求斐波那契(fibonacci)数列前20项的值 ,递归调用
    C++实现一句英文句子中的单词逆置
    C语言-黑白棋(人机对战)
    第九届蓝桥杯-明码
    四连块dfs
    八连块dfs
    求素数
  • 原文地址:https://www.cnblogs.com/leisurelylicht/p/er-fen-cha-zhao-ji-ji-zhong-bian-ti-dePython-shi-x.html
Copyright © 2011-2022 走看看