【Java版本】二分查找&数字在排序数组中出现的次数

二分查找

public class Array2Serach {
 public static void main(String [] args) {
  int a[] = {1,2,3,4,5,6,7};
  int b=7;  
  System.out.println(bserach1(a,b));
 }
 //二分查找 递归方式
 public static int bsearch(int a[],int b,int lo,int hi){    
  if(lo>hi){
   return -1;
  }else{
   int mid=lo+(hi-lo)/2;
   if(b==a[mid]){
    return mid;
   }else{
    if(b<a[mid]){
     return bsearch(a, b, lo, mid-1);
    }else{
     return bsearch(a, b, mid+1, hi);
    }
   }
  }
 }
 //二分查找 迭代方式
 public static int bserach1(int a[],int b){
  int lo=0;
  int hi=a.length-1;  
  while(hi>=lo){
   int mid=lo+(hi-lo)/2;
   if(b==a[mid]){
    return mid;
   }else if(b<a[mid]){
    hi=mid-1;
   }else{
    lo=mid+1;
   }
  }
  return -1;
 }
}

数字在排序数组中出现的次数

public class GetKNum {

 public static void main(String[] args) {
  int a[]={1,1,1,1,1,3,3,3,3,3,4,5};  
  System.out.println(getknum(a,2));

 }
 
 public static int getfirstk(int a[],int k,int low,int hi){
  int n=a.length;
  int j;
  if(n<=0){
   return -1;
  }else{
   int mid=(low+hi)/2;
   while((low<=mid)&&(mid<=hi)){
    if(k<a[mid]){
     return getfirstk(a,k,low,mid-1);
    }else if(k>a[mid]){
     return getfirstk(a,k,mid+1,hi);
    }else{
     for(j=mid-1;j>=0;j--){
      if(a[j]!=k){      
       break;
      }     
     }
     return j+1;
    }
   }
   return -1;   
  }
 }
 
 public static int getlastk(int a[],int k,int low,int hi){
  int n=a.length;
  int j;
  if(n<=0){
   return -1;
  }else{
   int mid=(low+hi)/2;
   while((low<=mid)&&(mid<=hi)){
    if(k<a[mid]){
     return getlastk(a,k,low,mid-1);
    }else if(k>a[mid]){
     return getlastk(a,k,mid+1,hi);
    }else{
     for(j=mid+1;j<n;j++){
      if(a[j]!=k){      
       break;
      }     
     }
     return j-1;
    }
   } 
   return -1;
  }
 }
 
 public static int getknum(int a[],int k){
  int firstk=getfirstk(a,k,0,a.length);
  int lastk=getlastk(a, k, 0, a.length);
  if(firstk==-1|| lastk==-1){
   return 0;
  }else{
   return (lastk-firstk+1);
  }
 }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值