二分查找
2013-09-18 11:25
169 查看
1. 这里查找的数组是非降序的,数组array,待搜索元素data
1) 在数组array中找出等于data的最小的元素下标;
2) 在数组array中找出等于data的最大的元素下标
3) 在数组array中找出大于data的最小的元素小标
参考:《编程之美》
代码如下:
1) 在数组array中找出等于data的最小的元素下标;
2) 在数组array中找出等于data的最大的元素下标
3) 在数组array中找出大于data的最小的元素小标
参考:《编程之美》
代码如下:
/** 二分查找 * @author MWD * 2013-9-18 */ public class biSearch { /** * 在有序数组array中,找到值等于data的最大元素小标 * @param array 非降序数组 * @param data 待搜索元素 * @return 找到就返回最大的元素下标,找不到就返回-1 */ private int maxIndexOfEqual(int[] array,int data){ int minIndex = 0; int maxIndex = array.length-1; while(minIndex < maxIndex-1){ int midIndex = minIndex+(maxIndex-minIndex)/2; //把搜索到的==data的当做小于data处理,所以要继续往右边搜索, //即坐边界继续往右移动 if(array[midIndex] <= data) minIndex = midIndex; else maxIndex = midIndex; } if(array[maxIndex] == data) return maxIndex; else if(array[minIndex] == data) return minIndex; else return -1; } /** * 在有序数组中array中,找到等于值等于data的最小下标元素 * @param array 非降序数组 * @param data 待搜索元素 * @return 找到返回最小的元素下标,找不到就返回-1 */ private int minIndexOfEqual(int[] array,int data){ int minIndex = 0; int maxIndex = array.length-1; while(minIndex < maxIndex-1){ int midIndex = minIndex+(maxIndex-minIndex)/2; //求取均值,可以防止溢出 //欲搜索等于data的最小的下标,把等于data当做小于data处理 //即要搜索到==data时要继续往左边搜索,即右边界要往左移动 if(array[midIndex] >= data) maxIndex = midIndex; else minIndex = midIndex; } if(array[minIndex] == data) return minIndex; else if(array[maxIndex] == data) return maxIndex; else return -1; } /** * 在有序数组中找到大于data的最小元素的下标 * @param array * @param data * @return */ private int minIndexOfBiggerThan(int[] array,int data){ int minIndex = 0; int maxIndex = array.length-1; while(minIndex < maxIndex-1){ int midIndex = minIndex + (maxIndex-minIndex)/2; if(array[midIndex] <= data) minIndex = midIndex; else maxIndex = midIndex; } if(array[maxIndex] == data){ if(maxIndex < array.length-1) return maxIndex+1; else return -1; } //可能待搜索的元素大于数组中的所有元素 else if(array[maxIndex] < data) return -1; else return maxIndex; } /** * 测试 * @param args */ public static void main(String[] args){ int[] array = {1,1,2,3,4,5,6,6,7,8}; biSearch bi = new biSearch(); System.out.println("搜索元素1,最小下标为:"+bi.minIndexOfEqual(array, 1)); System.out.println("搜索元素1,最大下标为:"+bi.maxIndexOfEqual(array, 1)); System.out.println("搜索大于6,最小下标为:"+bi.minIndexOfBiggerThan(array, 16)); } }
相关文章推荐
- 【jzoj3887】【字符串查询 】【二分查找】【可持久化trie】
- 华为中级机试题--二分查找树的应用
- 【数据结构】选择排序和二分查找
- POJ 2366 Sacrament of the sum(二分查找)
- 二分查找
- 二分查找
- POJ 1064 Cable master 二分查找
- 二分查找总结
- hdu 2578 Dating with girls(1)(二分查找)
- 二分查找iOS
- 二分查找
- 写好一段正确并且完整的二分查找也不容易
- Codeforces Round #417 (Div. 2) C. Sagheer and Nubian Market(二分查找)
- NYOJ 776 删除元素(二分查找)
- hiho一下 第三十七周 题目1 : 二分·二分查找之k小数
- 编程珠玑中关于二分查找的使用
- 二分查找递归和非递归
- 实现二分查找的算法
- Java 二分查找的简单使用
- Java递归算法——二分查找