5.5 数组常用操作(2)

最后更新于:2022-04-01 14:10:49

这一节我们接上一节继续学习数组的常用操作。 数组的查找 这个功能我们以后会经常用到,这里我们先看一个对普通数组的查找方法 ~~~ /* 数组常见功能:查找. */ public static int getIndex(int[] arr,int x) { for(int i=0;i<arr.length;i++)//从第一个元素开始找 { if(arr[i] == x)//如果找到对应元素则返回当前元素索引 { return i; } } return -1;//如果没有找到该元素则返回索引值-1 } ~~~ 上面的方法是一个普通的查找方法,因为我们在查找过程中可能对所有的元素都找一遍。 下面我们就看一个非常有名的查找算法,那就折半查找,也叫做二分查找。当然这个方法有一前提,那就是该数组必须为有序数组。 ~~~ public static int binarySearch(int[] arr,int key) { int min,mid,max;//定义三个变量做为三个指针 min = 0;//min代表最左边的指针 mid = (min + max) / 2;//mid代表中间的指针 max = arr.length-1;//max代表最右边的指针 while(arr[mid] != key)//当mid所指向的元素不等于key时,继续查找,否则则终止循环 { if(key > arr[mid])//如果mid指向的元素小于key,则让最左边的min指针指向mid+1的位置 min = mid + 1; else if(key < arr[mid])//反之则让最右边的max指针指向mid-1位置 max = mid - 1; if(max < min)//如果出现max指针小于min指针时,说明没有找到key对应的元素,则返回-1 return -1; mid = (min + max) / 2;//对中间的指针重新指向左右两个指针的中点 } return mid;//当跳出循环说明找到了 } ~~~ 再看另一个相同的的方法 ~~~ public static int binarySearch_2(int[] arr,int key) { int min,mid,max; int min = 0; int max = arr.length-1; while(min <= max)//当min>max则终止循环,返回-1 { mid = (min + max) >> 1;//在循环内找出min指针和max指针的中点元素,>>1等同于除以2 if(key > arr[mid])//如果mid指向的元素小于key,则让最左边的min指针指向mid+1的位置 min = mid + 1; else if(key < arr[mid])//反之则让最右边的max指针指向mid-1位置 max = mid - 1; else return mid;//否则就是key = arr[mid],那当然就是找到了 } return -1; } ~~~ 我们测试一下 ~~~ import java.util.*; class ArrayDemo6 { public static void main(String[] args) { int[] arr = new int[]{43,56,98,2,5,36};//无序数组 int x = getIndex(arr,3); System.out.println("x="+x); int[] arr2 = new int[]{3,9,12,19,23,45};//有序数组 int index = binarySearch(arr2,15); System.out.println("index="+index); int index1 = binarySearch_2(arr2,19); System.out.println("index1="+index1); //真实开发中,我们运用Arrays类中的binarySearch(Object[] a,Object key)方法 int index2 = Arrays.binarySearch(arr2,45);//如果存在,返回具体的角标位置 System.out.println("index2="+index2); int index3 = Arrays.binarySearch(arr2,21);//如果不存在,返回的就是这个数的插入点(return -插入点-1) System.out.println("index3="+index3); } } ~~~ 结果: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-18_573c41721a033.jpg) 我们看到Arrays类中的binarySearch(Object[] a,Object key)方法实现了数组的二分查找,并且当查找不元素不存在时,返回值的其实指明了该key可以插入数组并且数组仍然有序的插入点。我们在实际开发中直接用这个方法就可以了。
';