顺序查找:
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); } } }