二分查找的摸索

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诠释为中心值的索引


以上是关于二分查找的摸索的主要内容,如果未能解决你的问题,请参考以下文章

python算法:二分查找

Task 04:数组二分查找

异序二分查找 二分查找方程根 二分查找重复元素最后一个

每周算法小知识之二分查找

查找算法之“二分查找”

二分查找