這一節我們接上一節繼續學習數組的常用操作。
數組的查找
這個功能我們以後會經常用到,這裏我們先看一個對普通數組的查找方法
/*
數組常見功能:查找.
*/
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);
}
}
結果:
我們看到Arrays類中的binarySearch(Object[] a,Object key)方法實現了數組的二分查找,並且當查找不元素不存在時,返回值的其實指明瞭該key可以插入數組並且數組仍然有序的插入點。我們在實際開發中直接用這個方法就可以了。