二分查找

//n表示A的大小,A是有序数组且不包含重复元素
public int getPos(int[] A,int n,int val){
  if(n==0||A==null)
    return -1;

  int left=0;
  int right=n-1;
  int mid;

  while(right>=left){
    mid=left+(right-left)/2;
    if(A[mid]==val)
      return mid;
    if(A[mid]>val)
      right=mid-1;    //mid左一个,很重要,当不存在时,会导致循环条件不满足跳出循环
    if(A[mid]<val)
      left=mid+1;

  }



  return -1;
}

当数组中出现了相同数字时,返回该值第一次出现的位置 

public static int getPos(int[] A,int n,int val){
  if(n==0||A==null)
    return -1;

  int left=0;
  int right=n-1;
  int mid;

  while(right>left){
    mid=(right+left)/2;

    if(A[mid]>val)
      right=mid-1;
    else if(A[mid]<val)
      left=mid+1;
  /*
  * 当mid的值和val相等时,因为要返回最先出现的那个,所以让right=mid,
  * 这样再判断,当mid前面的中间值还是相等的值(有序),right就会继续往前,
  * 移到前面相等的位置。当前面不相等,left就会往后移,
  * 一直移到与right重合,此时 就可以跳出循环
  */
    else
      right=mid;

  }

  if(A[left]==val) return left;
  return -1;
}

ps:听说可以发表情

原文地址:https://www.cnblogs.com/xiaolovewei/p/7846512.html