您的位置:首页 > 编程语言 > Java开发

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

2016-04-16 20:35 633 查看
二分查找

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);

}

}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: