package searching; public class BinSearch_first_last { public static void main(String[] args) { // TODO Auto-generated method stub int[] a={3,5,10,10,10,13,13,19,23}; System.out.println(first(a,10)); System.out.println(last(a,10)); } private static int last(int[] a, int key) { int min=0,max=a.length-1; int mid=0; while(min<=max){ mid=(max+min+1)/2; if (key>=a[mid]) { min=mid; }else { max=mid-1; } if (max==min) { break; } } if (a[max]!=key) {//当查找元素不存在时,返回-1 return -1; }else { return max; } } private static int first(int[] a, int key) { // TODO Auto-generated method stub int min=0,max=a.length-1; int mid=0; while(min<=max){ mid=(max+min)/2; if (key>a[mid]) { min=mid+1; }else { max=mid; } if (max==min) { break; } } if (a[min]!=key) {//当查找元素不存在时,返回-1 return -1; }else { return min; } } }
最先出现和最后出现合并【小伙伴的代码,觉得很简洁,值得学习】
package searching; public class BinarySearchFL { public static void main(String[] args) { int[] a={10,10,10,10,10,13,13,19,23}; System.out.println(binarySearch(a, 13, 0)); } /** * @param a 待查数组 * @param key 待查关键字 * @param flag 如果flag等于0,表示查找关键字出现的第一个位置;如果flag等于1,返回关键字出现的最后一个位置 * @return 关键字的位置 */ private static int binarySearch(int[] a, int key, int flag) { int len = a.length; if(key < a[0] || key > a[len - 1]) return -1; int i = 0, j = len - 1; while(i <= j) { int mid = (i + j) / 2; if(key == a[mid]) { //接下来的三行代码是为了查找关键字出现的最早的位置 int tmp = mid; while(--tmp >= 0 && a[tmp] == key);//防止越界 i = tmp + 1; //应该新定义一个变量表示,用i存储也行。 //接下来的两行代码是为了查找关键字出现的最后的位置 while(++mid < len && a[mid] == key); j = mid - 1; //返回找到的关键字 if(flag == 0) return i; else return j; }else if(key > a[mid]){ i = mid + 1; }else { j = mid - 1; } } return -1; } }