演算法:分治法之二分查詢
阿新 • • 發佈:2019-01-30
一、分治法(三步)
分解:待解決的問題 分成 若干個子問題,子問題的求解方式跟之前的問題一樣
治理:各個子問題求解
合併:子問題的解合併
二、二分查詢
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); } }