Java中常用的查找算法——順序查找和二分查找
一、順序查找:
a) 原理:順序查找就是按順序從頭到尾依次往下查找,找到數據,則提前結束查找,找不到便一直查找下去,直到數據最后一位。
b) 圖例說明: 原始數據:int[] a={4,6,2,8,1,9,0,3}; 要查找數字:8
代碼演示:
import java.util.Scanner; /* * 順序查找 */ public class SequelSearch { public static void main(String[] arg) { int[] a={4,6,2,8,1,9,0,3}; Scanner input=new Scanner(System.in); System.out.println("請輸入你要查找的數:"); //存放控制台輸入的語句 int num=input.nextInt(); //調用searc()方法,將返回值保存在result中 int result=search(a, num); if(result==-1){ System.out.println("你輸入的數不存在與數組中。"); } else System.out.println("你輸入的數字存在,在數組中的位置是第:"+(result+1)+"個"); } public static int search(int[] a, int num) { for(int i = 0; i < a.length; i++) { if(a[i] == num){//如果數據存在 return i;//返回數據所在的下標,也就是位置 } } return -1;//不存在的話返回-1 } }
運行截圖:
二、二分查找
a) 前提條件:已排序的數組中查找
b) 二分查找的基本思想是:首先確定該查找區間的中間點位置: int mid = (low+upper) / 2;然后將待查找的值與中間點位置的值比較:若相等,則查找成功並返回此位置。若中間點位置值大於待查值,則新的查找區間是中間點位置的左邊區域。若中間點位置值小於待查值,則新的查找區間是中間點位置的右邊區域。下一次查找是針對新的查找區間進行的。
c) 圖例說明:
原始數據: int[] a={5,3,6,1,9,8,2,4,7}; 查找是否存在數字8;
第一步,先用之前學過的排序方法將數組按升序排序:int[] a={1,2,3,4,5,6,7,8,9};
第二步,取中間數:5跟8比較,8大於5 ,取中間數右側的數組進行比較,即{6,7,8,9}
第三步:重復第一步和第二步,直到找到數據或者比較完所有數據。
d) 代碼示例:
import java.util.Scanner; /* * 二分查找 */ public class BinarySearch { public static void main(String[] args) { int[] arr={5,3,6,1,9,8,2,4,7}; //先打印輸出原始數組數據 System.out.println("原始數組數據如下:"); for (int n : arr) { System.out.print(n+" "); } System.out.println(); //首先對數組進行排序,這里用冒泡排序 for(int i=0;i<arr.length-1;i++){ for(int j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ int temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } //遍歷輸出排序好的數組 System.out.println("經過冒泡排序后的數組:"); for(int n:arr){ System.out.print(n+" "); } System.out.println();//換行 Scanner input=new Scanner(System.in); System.out.println("請輸入你要查找的數:"); int num=input.nextInt(); int result=binarySearch(arr, num); if(result==-1){ System.out.println("你要查找的數不存在……"); } else{ System.out.println("你要查找的數存在,在數組中的位置是:"+result); } } //二分查找算法 public static int binarySearch(int[] arr,int num){ int low=0; int upper=arr.length-1; while(low<=upper){ int mid=(upper+low)/2; if(arr[mid]<num){ low=mid+1; } else if(arr[mid]>num){ upper=mid-1; } else return mid; } return -1; } }
運行截圖: