顺序查找:
import java.util.Scanner;
//顺序查找
public class Main {
public static void main(String[] args){
Scanner sr = new Scanner(System.in);
int fs = sr.nextInt();
int n = sr.nextInt();
int attr[] = new int[n];
for (int i=0;i<n;i++){
attr[i]=sr.nextInt();
}
int index = searchmy(attr,fs,n);
if (index==-1){
System.out.println("没有找到");
}else{
System.out.println(fs+" 找到了索引是:"+index);
}
}
static int searchmy(int att[],int m ,int n){
int index=-1;
for (int i=0;i<n;i++){
if(att[i]==m){
index = i;
break;
}else {
index = -1;
}
}
return index;
}
}
二分查找(不适用递归):
import java.util.Scanner;
/** T(n)=O(n)
* 循环二分查找,返回第一次出现该值位置,前提是有序,
* 二分查找必须使用顺序存储结构
*/
public class BinarySearch {
public static void main(String[] args){
Scanner sr = new Scanner(System.in);
int f = sr.nextInt(); //输入要查找到数字
int n = sr.nextInt(); // 输入多少个数字
int attr[] = new int[n]; // 开始循环输入数组
for (int i=0;i<n;i++){
attr[i]=sr.nextInt();
}
int index = searchmy(attr,f,n);
if (index==-1){
System.out.println("没有找到");
}else{
System.out.println(f+" 找到了索引是:"+index);
}
}
/**
* 不适用递归方式
* @param att
* @param m
* @param n
* @return
*/
static int searchmy(int att[],int m ,int n){
//指定首部和尾部的值,也就是,开始是0,和length,从而一点一点缩小
//指定low,high,mid
int low = 0;
int high=att.length;
int mid = 0;
while(low<high){
mid = (low+high)/2;
if(att[mid]==m){
return mid;
}else if(m<att[mid]){
high = mid - 1;
}else{ //m>att[mid]
low = mid+1;
}
}
return -1;
}
}
下面图像便于理解二分查找过程
使用递归方式的二分查找:
import java.util.Scanner;
public class binearSearch {
public static void main(String[] args){
Scanner sr = new Scanner(System.in);
int f = sr.nextInt(); //输入要查找到数字
int n = sr.nextInt(); // 输入多少个数字
int attr[] = new int[n]; // 开始循环输入数组
for (int i=0;i<n;i++){
attr[i]=sr.nextInt();
}
int index = searchmy(attr,f,n);
if (index==-1){
System.out.println("没有找到");
}else{
System.out.println(f+" 找到了索引是:"+index);
}
}
static int searchmy(int att[],int m ,int n){
int low = 0;
int high=att.length-1;
return searchmy(att,m,n,low,high);
}
/**
* 使用递归方式
* @param att
* @param m
* @param n
* @return
*/
static int searchmy(int att[],int m ,int n,int low,int high){
//指定首部和尾部的值,也就是,开始是0,和length,从而一点一点缩小
//指定low,high,mid,递归结束的条件
if(low >high){
return -1;
}
int mid = (low+high)/2;
if (m==att[mid]){
return mid;
}else if (m<att[mid]){
return searchmy(att,m,n,low,mid-1);
}else {
return searchmy(att,m,n,mid+1,high);
}
}
}