1. 程式人生 > >演算法:分治法之二分查詢

演算法:分治法之二分查詢

一、分治法(三步)

分解:待解決的問題 分成 若干個子問題,子問題的求解方式跟之前的問題一樣

治理:各個子問題求解

合併:子問題的解合併

二、二分查詢

1.前提條件

          有序的集合或者陣列

2.演算法思想

      a.定位中間的元素

      b.將問題分成【前 + 中 + 後】三部分處理

      c.前部分和後部分與原問題求解方式一樣,重複a、b可以求出子問題的解

      d.合併三部分的解

3.遞迴方式求解

package com.yan.algorithm.devide;

public class binarySearchByRecursive {
	public static int search(int[] a, int pre, int last, int x) {
		if(pre > last) {
			return -1;
		}
		
		int mid = (pre + last) / 2;
		
		if(x < a[mid]) {
			return search(a, pre, mid - 1, x);
		} else if(x == a[mid]) {
			return mid;
		} else {
			return search(a, mid + 1, last, x);
		}
		
	}
	
	public static void main(String[] args) {
		int[] a = {1, 3, 4, 11, 20, 33, 35, 67};
		int result = search(a, 0, 7, 33);
		
		System.out.println(result);
	}
	
}

4.非遞迴求解

package com.yan.algorithm.devide;

public class binarySearchNotRecursive {
	public static int search(int[] a, int x) {
		int pre = 0;
		int last = a.length -1;
		while (pre <= last) {
			int mid = (pre + last) / 2;
			if (x == a[mid]) {
				return mid;
			} else if (x < a[mid]) {
				last = mid - 1;
			} else {
				pre = mid + 1;
			}
		}

		return -1;
	}
	
	public static void main(String[] args) {
		int[] a = {1, 3, 4, 11, 20, 33, 35, 67};
		int result = search(a, 67);
		
		System.out.println(result);
	}
}