java面试题9--数组高级-二分查找
来源:互联网 发布:大学网络宣传部 编辑:程序博客网 时间:2024/04/27 19:45
首先明确一点:
二分查找是有条件限制的,被查找的数组要求一定是有序的
原理图:
这里有两个函数,分别使用非递归和递归思想实现了二分查找的功能
package search;import java.util.Scanner;public class BinarySearch { /** * 函数功能:非递归二分查找 * 输入参数:arg1:被查找的数组 * arg2:目标数字 * return:目标数字的index,若找不到返回-1 */ public static int binarySearchWithoutR(int[] arr,int target){ //定义查找段的开始head int head = 0; //定义查找段的结尾tail int tail = arr.length-1; System.out.println("查找的索引从"+head+"->"+tail); int middle = 0; while(head<=tail){ //定义需要被比较的中间数 middle = (head + tail)/2; if(arr[middle]==target){ return middle; }else if(target<arr[middle]){ tail = middle-1; }else if(target>arr[middle]){ head = middle+1; } } return -1; } /** * 函数功能:递归二分查找 * 输入参数:arg1:被查找的数组 * arg2:head--定位查找段的开始index * arg3:tail--定位查找端的结束index * arg4:target--目标数字 * return:目标数字的index,若找不到返回-1 */ public static int binarySearchWithR(int[] arr, int head, int tail, int target){ //定义需要被比较的中间数 int middle = (head+tail)/2; while(head<tail){ if(arr[middle]==target){ return middle; }else if(target<arr[middle]){ return binarySearchWithR(arr,head,tail = middle-1,target); }else if(target>arr[middle]){ return binarySearchWithR(arr,head=middle+1,tail,target); } } return -1; } /** * 格式打印数组 * @param arr */ public static void printArray(int [] arr){ System.out.print("["); for(int x=0;x<arr.length;x++){ if(x==arr.length-1){ System.out.print(arr[x]+"]"); System.out.println(); }else{ System.out.print(arr[x]+", "); } } } /** * @param args */ public static void main(String[] args) { //定义查找对象数组 int [] a ={1, 4, 5, 8, 15, 33, 36, 41, 48, 77, 81, 90, 94, 96}; printArray(a); System.out.println("请输入要查找的数,回车后开始查找"); Scanner scan = new Scanner(System.in); int target = new Integer(scan.next()); System.out.println("正在启动查找程序....."); //调用非递归查找函数 System.out.println("调用非递归查找函数----------------"); int res = binarySearchWithoutR(a, target); //判断结果 if(res==-1){ System.out.println("没有找到!!数组中不存在这个数"); }else{ System.out.println("找到了!index是:"+res); } //调用递归查找函数 System.out.println("调用递归查找函数-----------------"); int res1 = binarySearchWithR(a,0,a.length-1,target); //判断结果 if(res1==-1){ System.out.println("没有找到!!数组中不存在这个数"); }else{ System.out.println("找到了!index是:"+res1); } }}
查找结果演示:
[1, 4, 5, 8, 15, 33, 36, 41, 48, 77, 81, 90, 94, 96]请输入要查找的数,回车后开始查找36正在启动查找程序.....调用非递归查找函数----------------查找的索引从0->13找到了!index是:6调用递归查找函数-----------------找到了!index是:6
0 0
- java面试题9--数组高级-二分查找
- 二分查找面试题
- java基础面试题--二分查找思想的Java实现
- 字符串--java面试题, 首个重复字符串,二分查找
- Java高级面试题
- Java高级面试题
- java高级面试题
- Google面试题 之 二分逼近&二分查找 数组中第K小的数字
- 微策略面试题:在旋转后的数组中查找元素(二分查找)
- 面试题:循环数组查找数(二分查找的扩展应用)
- 剑指offer面试题之二维数组查找——二分查找的本质
- java面试题7--数组高级-冒泡排序
- java面试题8--数组高级-选择排序
- 面试题3 二维数组中的查找 java实现
- 关于二分查找的面试题归类
- [经典面试题]二分查找问题汇总
- 《剑指Offer》面试题3:二维数组中的查找(行列分别有序数组的二分查找)
- 2014-04-04 循环递增数组查找元素(二分变形思想,百度面试题)
- bzoj1030(ac自动机+dp)
- 不要在 Rake 中直接 Return
- Linux延时处理
- DllMain详解
- 51nod 1471 小S的兴趣 (分块)
- java面试题9--数组高级-二分查找
- 设计类的基本原则
- 有json,xml实现 App 接口
- 线程监视 OutputDebugString 的调试输出
- VC6.0实现鼠标显示按钮功能提示文本
- 《Java源码分析》:Future、RunnableFuture、FutureTask
- 详解互联网产品开发中的“快”字诀
- Android平台程序崩溃的类型及原因列举
- fresco加载图片,图片边缘被拉伸的解决方案