二分查找
来源:互联网 发布:c语言中mod 编辑:程序博客网 时间:2024/05/21 14:48
1. 这里查找的数组是非降序的,数组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;elsemaxIndex = midIndex;}if(array[maxIndex] == data)return maxIndex;else if(array[minIndex] == data)return minIndex;elsereturn -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;elseminIndex = midIndex;}if(array[minIndex] == data)return minIndex;else if(array[maxIndex] == data)return maxIndex;elsereturn -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;elsemaxIndex = midIndex;}if(array[maxIndex] == data){if(maxIndex < array.length-1)return maxIndex+1;elsereturn -1;}//可能待搜索的元素大于数组中的所有元素else if(array[maxIndex] < data)return -1;elsereturn 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));}}
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 安装64位版Oracle11gR2后无法启动SQLDeveloper的解决方案
- 浅析AngularJS
- 如何解决vs高级版本 不安全函数提示的问题
- android中按电源键锁屏然后解锁导致Activity调用onDestory以及如何防止锁屏 翻转屏幕也会触发的情况
- 847 - A Multiplication Game
- 二分查找
- getDimensionPixelSize 返回值波动
- 数学之路(3)-机器学习(3)-机器学习算法-贝叶斯定理(5)
- Learn CSS Positioning in Ten Steps
- Poj 1845 Sumdiv -- A的所有约数和
- shape和selector的结合使用
- web service调用
- 对年轻离职者的忠告
- Web App和Native App 谁将是未来