1. 程式人生 > >查詢演算法:二分(折半)查詢

查詢演算法:二分(折半)查詢

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均為正整數。