[javase學習筆記]-5.5 數組常用操作(2)

這一節我們接上一節繼續學習數組的常用操作。


數組的查找

這個功能我們以後會經常用到,這裏我們先看一個對普通數組的查找方法

	/*
	數組常見功能:查找.
	*/
	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可以插入數組並且數組仍然有序的插入點。我們在實際開發中直接用這個方法就可以了。


發佈了53 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章