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可以插入数组并且数组仍然有序的插入点。我们在实际开发中直接用这个方法就可以了。