這一節我們接上一節繼續學習數組的常用操作。
數組的查找
這個功能我們以后會經常用到,這里我們先看一個對普通數組的查找方法
~~~
/*
數組常見功能:查找.
*/
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可以插入數組并且數組仍然有序的插入點。我們在實際開發中直接用這個方法就可以了。
- 前言
- 1.1 基本常識
- 1.2 Java語言概述
- 1.3 Java語言的環境搭建
- 1.4 Java程序開發之初體驗--Hello World
- 2.1 關鍵字
- 2.2 標識符
- 2.3 注釋
- 2.4 常量
- 2.5 進制掃盲
- 2.6 變量和數據類型(1)
- 2.7 變量和數據類型(2)
- 2.8 運算符
- 3.1 if語句
- 3.2 switch語句
- 3.3 while和do-while語句
- 3.4 for語句
- 3.5 for循環的嵌套
- 3.6 break語句與continue語句
- 4.1 函數的定義
- 4.2 定義函數的兩個明確
- 4.3 函數的內存加載過程
- 4.4 函數的重載
- 5.1 數組的定義
- 5.2 數組的內存分配及特點
- 5.3 數組操作中常見問題
- 5.4 數組常用操作(1)
- 5.5 數組常用操作(2)
- 5.6 二維數組
- 6.1 面向對象的概述
- 6.2 類與對象的關系
- 6.3 對象的內存體現
- 6.4 成員變量與局部變量
- 6.5 類類型參數與匿名對象
- 6.6 基本數據類型參數與引用數據類型參數的傳遞過程
- 6.7 封裝
- 7.1 構造函數概述與默認構造函數
- 7.2 構造函數與一般函數的區別
- 7.3 構造函數的重載
- 7.4 構造函數的內存加載
- 7.5 構造函數需要注意的幾個細節
- 7.6 this關鍵字的原理
- 7.7 this關鍵字的細節與應用
- 8.1 static關鍵字之特點
- 8.2 成員變量與靜態變量的區別
- 8.3 static關鍵字使用的注意細節
- 8.4 main函數的解析與細節
- 8.5 static關鍵字的使用場景
- 8.6 靜態的內存加載
- 8.7 靜態代碼塊
- 8.8 構造代碼塊
- 9.1 繼承
- 9.2 單繼承與多重繼承
- 9.3 子父類中成員變量特征體現