二分搜索

来源:互联网 发布:数据挖掘分析工具 编辑:程序博客网 时间:2024/05/11 06:14
public class BinarySearch {public static Range search(int[] a, int value) throws Exception{if(a == null || a.length==0){throw new Exception("a is not valid input.");}if((value < a[0]) || (value > a[a.length-1])){throw new Exception("a is not in the range.");}if(value == a[0]){return new Range(a[0], a[0]);}if(value == a[a.length-1]){return new Range(a[a.length-1], a[a.length-1]);}return binarySearch(a, 0, a.length-1, value);}private static Range binarySearch(int[] a, int left, int right, int value) {if((right-left) == 1){return new Range(a[left], a[right]);}int mid = (left + right)/2;if(value == a[mid]){return new Range(a[mid], a[mid]);}if(value < a[mid]){return binarySearch(a, left, mid, value);}else{return binarySearch(a, mid, right, value);}}/** * 非递归二分搜索 * @param a * @param b * @return */public static int bSearch(int[] a, int b){int begin = 0;int end = a.length-1;while(begin <= end){int mid = (begin+end)/2;if(b == a[mid]){return b;}else if(b < a[mid]){end = mid - 1;}else{begin = mid + 1;}}return -1;}/** * 返回第一次出现的位置。 * @param a * @param b * @return */public static int bSearchFirst(int[] a, int b){int begin = 0;int end = a.length-1;int p = -1;while(begin <= end){int mid = (begin+end)/2;if(b == a[mid]){end = mid - 1;p = mid;}else if(b < a[mid]){end = mid - 1;}else{begin = mid + 1;}}return p;}/** * 返回最后一次出现的位置。 * @param a * @param b * @return */public static int bSearchLast(int[] a, int b){int begin = 0;int end = a.length-1;int p = -1;while(begin <= end){int mid = (begin+end)/2;if(b == a[mid]){begin = mid + 1;p = mid;}else if(b < a[mid]){end = mid - 1;}else{begin = mid + 1;}}return p;}/** * @param args */public static void main(String[] args) {int[] a = {1,2,3,4,6,7,8,8,8,9};try {Range result = BinarySearch.search(a, 5);System.out.println(result.left + "   " + result.right);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}int x = BinarySearch.bSearch(a, 9);System.out.println(x);x = BinarySearch.bSearchFirst(a, 8);System.out.println(x);x = BinarySearch.bSearchLast(a, 8);System.out.println(x);}public static class Range{public int left;public int right;public Range(int left, int right){this.left = left;this.right = right;}}}

原创粉丝点击