查找算法之二分查找

二分查找也叫折半查找

思路分析:

1.首先确定数组中间的下标mid=(left+right)/2

2.然后让查找的数findval与mid进行比较

   a.findval>mid;说明要查找的数在数组的右边,因此递归的向右进行查找

   b.findVal<mid:说明查找的数在数组的左边,因此递归的向左边进行查找

   c.findVal==mid:说明要查找的数就是,返回

注意:递归结束的时间

找到就结束递归

递归完整个数组,仍然没有找到数据,也需要结束递归,即left>right

代码:

package com.gcy.searcch;

import java.util.ArrayList;
import java.util.List;

import javax.lang.model.element.VariableElement;

/**
* 二分查找
* 要求:数组必须是有序的
* @author Administrator
*
*/
public class BinarySearch {

public static void main(String[] args) {
int[] arr={1,8,10,89,1000,1000,1000,1000,1234};
List<Integer> list=binarySearch2(arr, 0, arr.length-1, 1000);
System.out.println("list="+list);

}
/**
* 要找的数只要找到就立刻返回,不考虑在数组中该数字是否有重复,因此这种方法是有问题的,只能判断该数组中是否有要查找的数据
* @param arr数组
* @param left数组最左边 数据
* @param right数组最右边的数据
* @param val要查找的数据
* @return返回查找到的数据在数组中的下标值
*/
public static int binarySearch(int[] arr,Integer left,Integer right,int val) {
//当left>right时,说明递归整个数组,但是没有找到
if(left>right) {
return -1;
}
int mid=(left+right)/2;
int midVal=arr[mid];
if(val>midVal) {//向右递归
return binarySearch(arr, mid+1,right, midVal);
}else if(val<mid) {//向左边递归
return binarySearch(arr, left, mid-1, midVal);
}else {
return mid;
}
}
/**
* 数组中可能有多个相同的值,在查找故工程中全部查找出来
* 思路分析:
* 1.在找到mid索引值,不要立刻返回
* 2.向mid索引值的左边扫描,将所有满足的数值的下标,加入到ArrayList中
* 3.向mid索引值的右边扫描,将所有满足的数值的下标,加入到ArrayList中
* 4.返回ArrayList
* @param arr
* @param left
* @param right
* @param val
* @return
*/
public static ArrayList binarySearch2(int[] arr,Integer left,Integer right,int val) {
//当left>right时,说明递归整个数组,但是没有找到
if(left>right) {
return new ArrayList<>();
}
int mid=(left+right)/2;
int midVal=arr[mid];
if(val>midVal) {//向右递归
return binarySearch2(arr, mid+1,right, midVal);
}else if(val<mid) {//向左边递归
return binarySearch2(arr, left, mid-1, midVal);
}else {
ArrayList<Integer> resIndexList=new ArrayList<>();
int temp=mid-1;
while (true) {
if(temp<0 || arr[temp]!=val) {//退出
break;
}
//否则,就把temp放入到集合中
resIndexList.add(temp);
temp-=1;//temp左移
}
resIndexList.add(mid);

temp=mid+1;
while (true) {
if(temp>arr.length-1|| arr[temp]!=val) {//退出
break;
}
//否则,就把temp放入到集合中
resIndexList.add(temp);
temp+=1;//temp右移
}
return resIndexList;
}
}

}

在上面代码中,出现两个方法,上面都有解释,简单来说就是真实在写的时候,应该写出的是第二种,而不是第一种

结果截图:

 

posted @ 2020-10-07 20:10  IT特工  阅读(143)  评论(0编辑  收藏  举报