二分查找
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);
}
}
}