1. 程序员常用的十种算法之二分查找算法

二分查找算法

1. 二分查找算法介绍
  1. 二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找
  2. 二分查找法的运行时间为对数时间 O(㏒₂n),即查找到需要的目标位置最多只需要㏒₂n 步假设从[0,99]的队列(100 个数,即 n=100)中寻到目标数 30,则需要查找步数为㏒₂100 , 即最多需要查找 7 次( 2^6 < 100 < 2^7)
2. 二分查找算法(非递归)代码实现

数组{1,3, 8, 10, 11, 67, 100}, 编程实现二分查找, 要求使用非递归的方式完成.
leetcode—704. 二分查找

public class BinarySearchNoRecur {

	public static void main(String[] args) {
		int[] arr = {1,2,3,5,7,8,9,76};
		int binarySearch = binarySearch(arr,8);
		System.out.println(binarySearch);

	}
	 
	/**
	 * 	二分查找的非递归实现
	 * @param arr 待查找的数组, arr 是升序排序
	 * @param target 需要查找的数
	 * @return  返回对应下标,-1 表示没有找到
	 */
	public  static int binarySearch(int[] arr,int target) {
		int left = 0;
		int right = arr.length-1;
	
		 //说明继续查找
		while(left <= right) {
			
			int mid = (left + right)/2;
			
			if(arr[mid] == target) {
				return mid;
			}else if(arr[mid] < target) {
				left = mid + 1; //需要向右边查找
			}else if(arr[mid] > target) {
				right = mid - 1;//需要向左边查找
			}
		}
		
		return -1;
	}

}
  1. 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
  2. 内存消耗:40.6 MB, 在所有 Java 提交中击败了75.78%的用户
3. 二分查找算法(递归)代码实现

有多个相同的数值时,如何将所有的数值都查找到

public class BinarySearch {

	public static void main(String[] args) {
		int[] arr = {1,1,2,3,4,5,6,7,8,9};
		List<Integer> list = binarySearch(arr, 0, arr.length-1,1);
		System.out.println(list.toString());
	}
	
	/**
	 * @param arr 传来的有序数组
	 * @param left 左边的索引
	 * @param right 右边的索引
	 * @param searchVal 要查找的值
	 * @return 返回的查找的值,在数组中对应的索引
	 */
	public static List<Integer> binarySearch(int[] arr,int left,int right,int searchVal){
		
		//left>right表示递归到最后一位
		if(left>right) {
			return new ArrayList<Integer>();
		}
		
		
		int mid = (left+right)/2;//该数组中间的下标
		
	
		//如果要查找的值小于中间的值,向左递归
		if(searchVal<arr[mid]) {
			//注意递归的时候需要return
			return binarySearch(arr, left, mid-1, searchVal);
		}else if(searchVal > arr[mid]) {
			//向右递归
			return binarySearch(arr, mid+1, right, searchVal);
		
		}else {
			List<Integer> list = new ArrayList<Integer>();
			
			//向左遍历
			int temp = mid - 1 ;
			while(true) {
				if(temp<0 || arr[temp] != searchVal) {
					break;
				}
				list.add(temp);
				temp -=1;
			}
			//添加中间的值
			list.add(arr[mid]);
		
			//向右遍历
			temp = mid + 1 ;
			while(true) {
				if(temp>right || arr[temp] != searchVal) {
					break;
				}
				list.add(temp);
				temp +=1;
			}
			return list;
		}
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值