二分查找的摸索
Posted 超Web之家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找的摸索相关的知识,希望对你有一定的参考价值。
public class Validate {
public static int BinarySelect(int[]a){
int low=0;
int high=a.length-1;
int mid = 0;
while(low<high){
for(int i=0;i<a.length;i++){
mid=(a[low]+a[high])/2;
if(a[low]<mid){
low++;
}
if(a[high]>mid){
high--;
}
}
}
return mid;
}
public static void main(String[] args){
int[]a={1,2,3,4,5,6,7,8,9,10};
System.out.println(BinarySelect(a));
}
}
1没有出来最小值
2 出现的是中间值
3 for循环要写在while循环里面
4 不理解二分法查找的含义,要输入要查找的参数
5 没有考虑完low<high的情况,要写成low<high
6 理解mid=a[low]+a[high]/2.只取整数,别进一。
package com.hhwy.fweb.commons.excel.domain;
public class Validate {
public static int BinarySelect(int[]a,int n){
int low=0;
int high=a.length-1;
while(low<=high){
for(int i=0;i<a.length;i++){
int mid=(a[low]+a[high])/2;
if(mid==n){
return 1;
}
if(mid<n){
return low++;
}else{
return high--;
}
}
}
return n;
}
public static void main(String[] args){
int[]a={1,2,3,4,5,6,7,8,9,10};
System.out.println(BinarySelect(a,3));
}
}
第二版,i++此处是多余的,去掉for循环
第三版,没有找到索引位置,low++和high--这样递增和递减一位的速度太慢了,影响算法效率。
public class Validate {
public static int BinarySelect(int[]a,int n){
int low=0;
int high=a.length-1;
while(low<=high){
int mid=(low+high)/2; //这里是核心
if(a[mid]==n){
return mid; //找元素与中间值相等的时候返回中间值
}
else if(mid<n){ //小于的话,则low提高一位
low++;
}else{
high--; //大于的话,则high减少一位
}
}
return -1; //找不到该元素时返回-1
}
public static void main(String[] args){
int[]a={1,2,3,4,5,6,7,81,9,10,11};
System.out.println(BinarySelect(a,81));
}
}
第四版 将mid诠释为中心值的索引
以上是关于二分查找的摸索的主要内容,如果未能解决你的问题,请参考以下文章