数据结构与算法--二分查找算法

  • 二分查找的思路分析
  • 1.首先确定改数组的中间下标
  • mid = (left+right)/2;
  • 2.然后让需要找到的数findVal和arr[mid]比较
  • 2.1findVal>arr[mid] ,说明要查找的数在mid的右边,因此需要递归向右查找
  • 2.2findVal<arr[mid],说明要查找的数在mid的左边,因此需要递归的向左查找
  • 2.3findVal == arr[mid] 说明找到了就返回

什么时候结束递归

  1. 找到就结束递归
  2. 递归完整个数组,任然没有找到findVal,也需要结束递归,当left>right 就需要退出

*** 当有多个相同的数值时的处理**
* 思路分析:
* 1。在找到mid索引值,不要马上返回,
* 2.向mid索引的左边扫描,将所有满足1000的元素的下标,加入到集合ArrayList
* 3.向mid索引的右边扫描,将所有满足1000的元素的下标,加入到集合ArrayList
* 4.将ArrayList返回
*/

package com.hadwinling.search;

import java.util.ArrayList;
import java.util.List;
public class BinarySearch {
	public static void main(String[] args) {
		int [] arr1 = {1,9,11,34,89,100,100,121};
		List<Integer> lists = binarySeearch2(arr1, 0, arr1.length-1, 100);
//		System.out.println(lists.size());
		if (lists.size()==0) {
			System.out.println("该数组没有这个值");
		}else {
			System.out.println(lists);
		}
	}
	//二分查找
	/**
	 * 
	 * @param arr	要查找的数组
	 * @param left	数组左边的索引
	 * @param right	数组右边的索引
	 * @param findVal	要查找的值
	 * @return	如果找到就返回下标,如果没有找到就返回-1
	 */
	public static int binarySeearch(int[]arr,int left,int right,int findVal) {
		//当left>right时,说明递归整个数组,但是没有找到
		if (left>right) {
			return -1;
		}
		
		int mid = (left+right)/2;
		int midVal = arr[mid];
		if (findVal>midVal) {
			//向右递归
			return binarySeearch(arr, mid+1, right, findVal);
		}else if (findVal<midVal) {
			return binarySeearch(arr, left, mid-1, findVal);
		}else {
			return mid;
		}
	}
	/*
	 * 当有多个相同的数值时的处理
	 */
	/*
	 * 思路分析:
	 * 1。在找到mid索引值,不要马上返回,
	 * 2.向mid索引的左边扫描,将所有满足1000的元素的下标,加入到集合ArrayList
	 * 3.向mid索引的右边扫描,将所有满足1000的元素的下标,加入到集合ArrayList
	 * 4.将ArrayList返回
	 */

	public static List<Integer> binarySeearch2(int[]arr,int left,int right,int findVal) {
		//当left>right时,说明递归整个数组,但是没有找到
		if (left>right) {
			return new ArrayList<Integer>();
		}
		
		int mid = (left+right)/2;
		int midVal = arr[mid];
		if (findVal>midVal) {
			//向右递归
			return binarySeearch2(arr, mid+1, right, findVal);
		}else if (findVal<midVal) {
			return binarySeearch2(arr, left, mid-1, findVal);
		}else {
			List<Integer> resIndexlists = new ArrayList<Integer>();
			int temp = mid-1;
			while (true) {
				if (temp<0||arr[temp]!=findVal) {//退出
					break;
				}
				//否则,就temp放入到list
				resIndexlists.add(temp);
				temp-=1;//temp 左移
			}
			resIndexlists.add(mid);
			
			//向mid索引值的右边扫描,将所有满足findVal的元素的下标,加入到集合ArrayList
			temp = mid+1;
			while (true) {
				if (temp>arr.length-1||arr[temp]!=findVal) {//退出
					break;
				}
				//否则,就temp,放入到list中
				resIndexlists.add(temp);
				temp+=1;//temp 右移
			}
			return  resIndexlists;
		}
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值