【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);
}
}
}
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);
}
}
}
相关文章推荐
- java设计模式之模板方法
- java 版的复利计算器(张俊毅 周修文)
- 20145238-荆玉茗 《Java程序设计》第2次实验
- java-cef系列视频第三集:添加flash支持
- JavaEE 基础 JDK环境配置
- RxJava的解析,帮助你了解RxJava
- org.springframework.beans.factory.BeanCreationException
- JavaEE开学随记1
- JAVA一个类有两个构造函数,当在一个构造函数中调用另外一个构造函数时为什么要用this.()而不能用类名.()
- 使用substance包优化java界面
- Java 往TreeSet集合中存储自定义对象学生,按照学生的年龄进行排序。
- 深入研究java.lang.Class类
- Eclipse快捷键
- Java —— Reflect反射机制
- JavaWeb总结(九)—过滤器
- Spring注入bean报错:Error creating bean with name的网上找不到的解决方案
- java之正则表达式的使用1
- java 泛型实现Dao 操作的重用
- Java数组使用注意事项
- 《Spring设计思想》AOP实现原理(基于JDK和基于CGLIB)