常用算法-查找
1.1 顺序查找
说明:从第一个位置开始依次比较查找
如:
packageday06;
publicclassQuery1 {
/**
* 顺序查找
* @param arr 提供的数组
* @param item 查找的元素
* @return
*/
staticintquery(int[] arr, intitem, intstart){
inti=-1; // -1 代表的是没有查找到元素
// 数组中的元素可以重复吗?如果想从指定的位置之后查找?
for (intj=start; j<arr.length; j++) {
if(arr[j] ==item){
i=j; // 从start开始,找到第1个出现的元素位置
break;
}
}
returni;
}
/**
* 重载的顺序查询方法
* @param arr 数组对象
* @param item 从数组中查询的元素
* @return 元素在数组中的位置
*/
staticintquery(int[] arr, intitem){
returnquery(arr, item, 0);
}
publicstaticvoidmain(String[] args) {
// { } 单纯符号,表示为方法中的局部代码块
int[] ns= {5, 6, 1, 3, 2, 1, 9};
System.out.println(query(ns, 1)); // 2
System.out.println(query(ns, 1, 3)); // 5
}
}
1.2二分查找
前提条件:已排序的数组中查找
基本思路
1、 确定查找区间的中心位置: int mid=(low+upper)/2
2、若中间点位置值大于待查值,则新的查找区间是中间点位置的左边区域
3、若中间点位置值小于待查值,则新的查找区间是中间点位置的右边区域
4、下一次查找是针对新的查找区间进行的。
packageday06;
importjava.util.Arrays;
publicclassQuery1 {
staticintbinaryQuery(int[] arr, intitem, intleft, intright){
if(left>right) return-1;
intmid= (left+right) /2;
if(arr[mid] ==item) returnmid;
elseif (arr[mid] <item){
returnbinaryQuery(arr, item, mid+1, right);
}elsereturnbinaryQuery(arr, item, left, mid-1);
}
publicstaticvoidmain(String[] args) {
int[] ns= {5, 6, 1, 3, 2, 1, 9};
// 1. 先对ns进行排序
Arrays.sort(ns); // 默认采用快速排序
System.out.println(Arrays.toString(ns));
System.out.println(binaryQuery(ns, 4, 0, ns.length-1));
}
}