二分查找
 //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:听说可以发表情

 
                    
                     
                    
                 
                    
                 
                
            
         
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号