java面试题9--数组高级-二分查找
2016-08-06 17:09
579 查看
首先明确一点:
二分查找是有条件限制的,被查找的数组要求一定是有序的
原理图:
这里有两个函数,分别使用非递归和递归思想实现了二分查找的功能
二分查找是有条件限制的,被查找的数组要求一定是有序的
原理图:
这里有两个函数,分别使用非递归和递归思想实现了二分查找的功能
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
相关文章推荐
- Java数组遍历、求最大值、选择排序、冒泡排序、二分查找
- 2014-04-04 循环递增数组查找元素(二分变形思想,百度面试题)
- java面试题8--数组高级-选择排序
- java基础复习--数组的二分查找
- 剑指Offer面试题8旋转数组的最小数字(二分查找)附带快排和按年龄排序
- java基础知识4--数组,排序,二分查找
- 【Java版本】二分查找&数字在排序数组中出现的次数
- Java数组与二分查找
- java数组排序,二分查找
- 字符串--java面试题, 首个重复字符串,二分查找
- 微策略面试题:在旋转后的数组中查找元素(二分查找)
- 剑指offer——面试题38:数字在排序数组中出现的次数(利用二分查找来找第一次和最后一次的位置)
- 【剑指offer】面试题3:二位数组中的查找 java
- 常见对象_数组高级二分查找原理图解
- 重学java之随机数组二分查找
- 微策略面试题:在旋转后的数组中查找元素(二分查找)
- java数组中二分查找Demo范例
- Java实现数组二分查找及递归二分查找
- 二分查找,数组去重Java
- 剑指offer面试题之二维数组查找——二分查找的本质