public class 二分查找_有序队列 {
public static void main(String[] args) {
int [] aa = {1,1,1,4,4,4,23,53,53,53,64,64,64,123,123,275,275,275} ;
System.out.println("index="+erfenfaLeft(aa,1));
System.out.println("index="+erfenfaLeft(aa,4));
System.out.println("index="+erfenfaLeft(aa,23));
System.out.println("index="+erfenfaLeft(aa,53));
System.out.println("index="+erfenfaLeft(aa,64));
System.out.println("index="+erfenfaLeft(aa,123));
System.out.println("index="+erfenfaLeft(aa,275));
System.out.println("----");
System.out.println("index="+erfenfaRight(aa,1));
System.out.println("index="+erfenfaRight(aa,4));
System.out.println("index="+erfenfaRight(aa,23));
System.out.println("index="+erfenfaRight(aa,53));
System.out.println("index="+erfenfaRight(aa,64));
System.out.println("index="+erfenfaRight(aa,99));
System.out.println("index="+erfenfaRight(aa,123));
System.out.println("index="+erfenfaRight(aa,275));
System.out.println("----");
System.out.println("index="+erfenfaRight2(aa,1));
System.out.println("index="+erfenfaRight2(aa,4));
System.out.println("index="+erfenfaRight2(aa,23));
System.out.println("index="+erfenfaRight2(aa,53));
System.out.println("index="+erfenfaRight2(aa,64));
System.out.println("index="+erfenfaRight2(aa,99));
System.out.println("index="+erfenfaRight2(aa,123));
System.out.println("index="+erfenfaRight2(aa,275));
System.out.println("---- aa end ");
int [] bb = {1,2,3,4,7,9,23,53,57,59,64,66,69,123,126,275,295,375} ;
System.out.println("index="+erfenfa2(bb,1));
System.out.println("index="+erfenfa2(bb,4));
System.out.println("index="+erfenfa2(bb,23));
System.out.println("index="+erfenfa2(bb,53));
System.out.println("index="+erfenfa2(bb,64));
System.out.println("index="+erfenfa2(bb,123));
System.out.println("index="+erfenfa2(bb,275));
System.out.println("----");
System.out.println("index="+erfenfa3(bb,1));
System.out.println("index="+erfenfa3(bb,4));
System.out.println("index="+erfenfa3(bb,23));
System.out.println("index="+erfenfa3(bb,53));
System.out.println("index="+erfenfa3(bb,64));
System.out.println("index="+erfenfa3(bb,123));
System.out.println("index="+erfenfa3(bb,275));
}
public static int erfenfa(int[] arr , int target ){
int i = 0 ;
int j = arr.length - 1;
while (i<=j){
int m = (i+j) >>> 1 ;
if (arr[m] == target){
return m ;
}else if(arr[m] < target){
i = m+1;
}else if(arr[m] > target){
j = m-1;
}
}
return -1 ;
}
public static int erfenfa2(int[] arr , int target ){
int i = 0 ;
int j = arr.length ;
while (i<j){
int m = (i+j) >>> 1 ;
if (arr[m] == target){
return m ;
}else if(arr[m] < target){
i = m+1;
}else if(arr[m] > target){
j = m;
}
}
return -1 ;
}
public static int erfenfa3(int[] arr , int target ){
int i = 0 ;
int j = arr.length ;
while (i < j-1){
int m = (i+j) >>> 1 ;
if (target < arr[m]){
j = m;
}else {
i = m;
}
}
if (arr[i] == target){
return i;
}else{
return -1 ;
}
}
public static int erfenfaLeft(int[] arr , int target ){
int i = 0 ;
int j = arr.length - 1;
int current = -1 ;
while (i<=j){
int m = (i+j) >>> 1 ;
if (target < arr[m]){
j = m-1;
}else if(arr[m] < target){
i = m+1;
}else {
current = m ;
j = m-1;
}
}
return current;
}
public static int erfenfaLeft2(int[] arr , int target ){
//给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
int i = 0 ;
int j = arr.length - 1;
while (i<=j){
int m = (i+j) >>> 1 ;
if (target <= arr[m]){
j = m-1;
}else {
i = m+1;
}
}
return i;
}
public static int erfenfaRight(int[] arr , int target ){
int i = 0 ;
int j = arr.length - 1;
int current = -1 ;
while (i<=j){
int m = (i+j) >>> 1 ;
if (target < arr[m]){
j = m-1;
}else if(arr[m] < target){
i = m+1;
}else {
current = m ;
i = m+1;
}
}
return current;
}
public static int erfenfaRight2(int[] arr , int target ){
// 找最右侧的值 找不到就返回当前可以添加的位置
int i = 0 ;
int j = arr.length - 1;
while (i<=j){
int m = (i+j) >>> 1 ;
if (target < arr[m]){
j = m-1;
}else{
i = m+1;
}
}
return i-1;
}
}