利用二分法查找指定的数在数组中的位置

利用二分法查找指定的数在数组中的位置
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较 少;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常 变动而查找频繁的有序列表。
【算法原理】
假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
【算法要求】
1)必须采用顺序存储结构。
2)必须按关键字大小有序排列。
【算法描述】

//找到指定的数,返回该数在数组内的位置,否则返回-1
public class DiGuiXieErFenFa {
	public static void main(String[] args) {
		int element = 0;
		int[] arr = new int[]{1,3,4,6,9,13,56,76};
		//数组内部可以是任何形式如String[]
		System.out.println(m(arr,0,arr.length-1,element));
		//System.out.println(searchValue(arr, 0, arr.length-1, element));
	}

public static int binarySearch(Integer[] srcArray, int des) {
//定义初始最小、最大索引int low = 0;
    int high = srcArray.length - 1;
    //确保不会出现重复查找,越界
  while (low <= high) {
    //计算出中间索引值
    int middle = (high + low)/2 ;
    //防止溢出
    if (des == srcArray[middle]) {
    return middle;
    //判断下限
    } else if (des < srcArray[middle]) { 
        high = middle - 1;
    //判断上限
    } else {
    low = middle + 1;
    }
  }
//若没有,则返回-1 return -1;
}	

	//递归写二分查找
	//定义方法searchValue,传入指定的数组,开始下表,结束下表,以及目标元素
	public static int searchValue(int[] arr, int start, int end, int element) {
		int res = -1;
		if (end<start) {
			return -1;
		}
		if (start <= end) {
			int middle = (start + end) / 2;
			int middleVaule = arr[middle];
			if (middleVaule == element) {
				return middle;
			} else if (middleVaule > element) {
				return searchValue(arr, start, middle - 1, element);
			} else {
				return searchValue(arr, middle + 1, end, element);
			}
		}
		return res;
		}
	}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值