[javase学习笔记]-5.5 数组常用操作(2)
2015-12-14 21:47
633 查看
这一节我们接上一节继续学习数组的常用操作。
数组的查找
这个功能我们以后会经常用到,这里我们先看一个对普通数组的查找方法
/*
数组常见功能:查找.
*/
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://img-blog.csdn.net/20151214223103345)
我们看到Arrays类中的binarySearch(Object[] a,Object key)方法实现了数组的二分查找,并且当查找不元素不存在时,返回值的其实指明了该key可以插入数组并且数组仍然有序的插入点。我们在实际开发中直接用这个方法就可以了。
数组的查找
这个功能我们以后会经常用到,这里我们先看一个对普通数组的查找方法
/*
数组常见功能:查找.
*/
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可以插入数组并且数组仍然有序的插入点。我们在实际开发中直接用这个方法就可以了。
相关文章推荐
- C++二分查找在搜索引擎多文档求交的应用分析
- C语言编程中实现二分查找的简单入门实例
- C#二分查找算法实例分析
- 在MySQL中实现二分查找的详细教程
- php数组查找函数in_array()、array_search()、array_key_exists()使用实例
- Java实现二分查找算法实例分析
- Python二分查找详解
- 简介二分查找算法与相关的Python实现示例
- 漫谈递归:二分查找算法的递归实现
- 二分查找
- [LeetCode] Find Minimum in Rotated Sorted Array
- 折半查找法
- "二分查找(Binary Search)"与"斐波那契查找(Fibonacci Search)"
- 二分查找
- C#版二分查找(代碼)
- 4495: Least Prime factor 找到最小质因子P的第N小正整数
- 使用Java完成《算法导论》习题2.3-5
- 使用Java完成《算法导论》习题2.3-6
- 使用Java完成《算法导论》习题2.3-7
- Sort Colors,Search in Rotated Sorted Array I,II,Merge Intervals,Insert Interval,Subsets II