一、对数组的线性查找算法。
查找:顾名思义,是自己想要的元素在数组中寻找,看看是否在数组中。
线性查找的原理:线性查找是最基本的查找方式,它是通用自己想获得的目标元素与数组中各个元素进行比对,比对成功则找到该目标元素,反之未找到。
下面使用java语言来编写实现对数组线性查找的方法:
//定义线性查找的方法,参数为目标元素
public static void LineSearch(int target){
//定义目标数组arr,并初始化
int[] arr = new int[] {1,8,10,6,30,5,12,23};
//定义目标元素的下标,初始为-1
int index=-1;
/*进行for循环,将数组中的元素与目标元素对比,如存在,则返回目标元素在
* 数组中的下标,若不存在,则返回初始下标-1
*/
for(int i=0; i<arr.length; i++) {
if(arr[i]==target) {
index = i;
break; //终止当前循环
}
}
System.out.println("线性查找算法的目标元素在数组中的下标为:"+index);
}
以上代码是实现该线性查找的方法,若目标元素在数组中,输出目标元素在数组中的下标,反之输出-1。
若要在java中运行该方法,需要在main方法中调用该方法,下面有完整代码。
二、对数组的二分查找算法。
二分查找算法的原理:首先要确保数组中的数据是有序的(默认是从小到大排序),在有序的数据中查找目标元素,与上面线性查找算法中各个比对相比,效率要快的多。一定要注意,前提是有序数据,若不是有序数据,则不能使用二分查找算法。
//定义二分查找的方法,参数为目标元素
public static void BinarySearch(int target) {
//定义目标数组newArr,并初始化,注意,二分查找的前提是:一组数是按从小到大排列的
int[] newArr = new int[] {1,2,3,4,5,6,7,8,9};
//定义目标元素的下标,初始为-1
int index = -1;
//记录数组的开始位置
int begin = 0;
//记录数组的结束位置
int end = newArr.length-1;
//记录数组的中间位置
int mid = (begin+end)/2;
//循环查找
while(true) {
//上开始位置在结束位置之后或重合,此时还没查找到目标元素,则代表数组中没有该元素,返回-1
if(begin>=end) {
return -1;
}
//判断中间的这个元素是否是要查找的元素
if(newArr[mid]==target) {
index=mid;
break;
//中间这个元素不是要查找的元素
}else {
//如果中间这个元素比目标元素大
if(newArr[mid]>target) {
end = mid-1; //把结束位置调整到中间位置的前一个元素
}else {
begin = mid+1; //把开始位置调整到中间位置的后一个元素
}
//确定新的中间元素
mid = (begin+end)/2;
}
}
System.out.println("二分查找算法的目标元素的下标为:"+index);
}
以上代码是实现该二分查找的方法,若目标元素在数组中,输出目标元素在数组中的下标,反之输出-1。
若要在java中运行该方法,需要在main方法中调用该方法,下面有完整代码。
完整代码:
public class ArraySearch{
//定义线性查找的方法,参数为目标元素
public static void LineSearch(int target){
//定义目标数组arr,并初始化
int[] arr = new int[] {1,8,10,6,30,5,12,23};
//定义目标元素的下标,初始为-1
int index=-1;
/*进行for循环,将数组中的元素与目标元素对比,如存在,则返回目标元素在
* 数组中的下标,若不存在,则返回初始下标-1
*/
for(int i=0; i<arr.length; i++) {
if(arr[i]==target) {
index = i;
break; //终止当前循环
}
}
System.out.println("线性查找算法的目标元素在数组中的下标为:"+index);
}
//定义二分查找的方法,参数为目标元素
public static void BinarySearch(int target) {
//定义目标数组newArr,并初始化,注意,二分查找的前提是:一组数是按从小到大排列的
int[] newArr = new int[] {1,2,3,4,5,6,7,8,9};
//定义目标元素的下标,初始为-1
int index = -1;
//记录数组的开始位置
int begin = 0;
//记录数组的结束位置
int end = newArr.length-1;
//记录数组的中间位置
int mid = (begin+end)/2;
//循环查找
while(true) {
//上开始位置在结束位置之后或重合,此时还没查找到目标元素,则代表数组中没有该元素,返回-1
if(begin>=end) {
return -1;
}
//判断中间的这个元素是否是要查找的元素
if(newArr[mid]==target) {
index=mid;
break;
//中间这个元素不是要查找的元素
}else {
//如果中间这个元素比目标元素大
if(newArr[mid]>target) {
end = mid-1; //把结束位置调整到中间位置的前一个元素
}else {
begin = mid+1; //把开始位置调整到中间位置的后一个元素
}
//确定新的中间元素
mid = (begin+end)/2;
}
}
System.out.println("二分查找算法的目标元素的下标为:"+index);
}
//在主方法中进行调用测试
public static void main(String[] args) {
//调用线性查找函数,将参数赋为6
LineSearch(6);
//调用二分查找函数,将参数赋为3
BinarySearch(3);
}
}
执行结果: