java学习之查找
在一组数据当中我们取出一个我们想要的数据的过程,谓之查找。
1、简单查找:
需求:在一组数据当中找到你想要的一个数据,并且返回该数据在数组当中的索引。
思路:循环遍历整个数组,然后拿各个元素与所要找出的数字做比较,如果相等返回该位置的索引,相反如果查找完之后,仍没有找到数据,此时就返回-1,表示该数据不再数组当中。
代码:
class SimpleFind { public static void main(String [] args) { int[] arr = {1,3,89,43,6,80}; System.out.print(simpleFind(arr,3)); } public static int simpleFind(int [] arr,int key) { for(int i = 0; i<arr.length ; i++) { if(arr[i] == key) return i; continue; } return -1; } }
但是这种方法相对来说有些低效,下面我们介绍一种比较高效的一种方法。
思路:假如现在我们要查找一个数在一个已经排序好了的数组中。较之第一种方法,我们先拿我们要找的数字与数组中间的数字做比较,如果数字大于中间的数字,此时我们数字肯定不再中间数字的左边了,但是可能存在于数字右边。我们再拿要找的数字与右边一半的数字做比较,如果大于则继续查找右边的那一半,否则查找左边的另一半。周而往复,直至查找到,返回索引值,否则返回-1,表示数组当中不存在这个数字。
class BinarySearch { public static void main(String[] args) { int[] arr = {1,4,7,8,13,24,56,99}; //System.out.print(binarySearch(arr,13)); System.out.print(binarySearch2(arr,56)); } public static int binarySearch(int[] arr, int key) { int mid = (arr.length-1)>>>1; //System.out.print(mid); int min = 0; int max = arr.length-1; //System.out.print(min<max); while(min<=max) { if(arr[mid]>key){ max = mid-1; mid = (min+max)>>>1; }else if(arr[mid]<key){ min = mid+1; mid = (max+min)>>>1; }else{ return mid; } //System.out.println("min = "+min+" "+"max = "+max); } return -1; } public static int binarySearch2(int[] arr, int key) { int mid = (arr.length-1)>>>1; //System.out.print(mid); int min = 0; int max = arr.length-1; //System.out.print(min<max); while(arr[mid] != key) { if(arr[mid]>key){ if(max<min) return -1; max = mid-1; mid = (min+max)>>>1; }else{ if(max<min) return -1; min = mid+1; mid = (max+min)>>>1; } //System.out.println("min = "+min+" "+"max = "+max); } return mid; } }