查詢演算法:二分(折半)查詢
阿新 • • 發佈:2018-11-14
package com.Algorithm.Search_Sort; import java.util.Arrays; public class Search { public int array[] = {99,34,76,92,34,17,77,41,40,36,6}; //二分查詢 or 折半查詢 public void BinarySearch(int num){//只適用於升序陣列 //對於無序陣列要先進行排序 int arr[]=this.array; Arrays.sort(arr); System.out.println("使用二分查詢法的陣列為:"+Arrays.toString(arr)); //設定查詢的起始位置和終點位置下標 int start = 0,end = arr.length-1,mid; //設定是否查詢成功的標記:記錄查詢到的下標,值=位置-1 int index = -1; //查詢條件 while(start <= end){//次數必須要加上=號,加上才能比對相鄰的兩個數 mid = (start + end) / 2; //與 mid = (start + end) >>> 1;作用相同 //mid的顯示次數為查詢次數,7 < 8=2的3次方,7個數最多查詢3次 System.out.println("mid"+mid); if(num == arr[mid]){//查詢成功 index = mid; break;//找到之後就已經完成任務了,要跳出迴圈 }else if(num > arr[mid]){//從後半段陣列繼續進行查詢 start = mid + 1; }else{ end = mid - 1; } }// end while if(index == -1){ System.out.println("查詢失敗,該陣列中沒有數字"+num); }else{ System.out.println("查詢成功,"+num+"在陣列中的位置為"+(index+1)); } } public static void main(String[] args) { Search s=new Search(); s.BinarySearch(99); //直接使用java的函式進行升序排序及二分查詢 Arrays.sort(s.array); int index = Arrays.binarySearch(s.array, 99); if(index < 0){ System.out.println("查詢失敗,該陣列中沒有數字"); }else{ System.out.println("查詢成功,該數字在陣列中的位置為"+(index+1)); } } }
查詢結果為:
比較次數:
計算公式:
當順序表有n個關鍵字時:
查詢失敗時,至少比較a次關鍵字;查詢成功時,最多比較關鍵字次數是b。
注意:a,b,n均為正整數。