这一节我们接上一节继续学习数组的常用操作。
数组的查找
这个功能我们以后会经常用到,这里我们先看一个对普通数组的查找方法
~~~
/*
数组常见功能:查找.
*/
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://box.kancloud.cn/2016-05-18_573c41721a033.jpg)
我们看到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 子父类中成员变量特征体现