package LearnCases;
import java.time.Instant;
/**
* Created with IntelliJ IDEA.
*
* @Auther: suibin
* @Date: 2021/06/04/13:16
* @Description: 手写一个二分查找,手写一个幂运算
*/
public class BinarySearch {
//手写一个二分查找
static int binarySearch(Integer []arr,Integer x){
int low=0,high= arr.length-1;
while (low<=high){
int mid=(low+high)/2;//取中间值
if(arr[mid].compareTo(x)<0)//比较中间值和x,mid<x返回-1;
low=mid+1;
else if(arr[mid].compareTo(x)>0)//比较中间值和x,mid>x返回1;
high=mid-1;
else
return mid;
}
return -1;
}
//手写一个幂运算;如计算:2^64方的值,2*2*2*2......64次;常用递归函数就可以实现。这里用分半的俩次乘法来提高计算效率。根据奇数和偶数拆成2个部分,n/2分别计算
static double pow(double x,int n){
if(n==0)
return 1;
if(n==1)
return x;
if(isEven(n))
return pow(x*x,n/2);
else
return pow(x*x,n/2)*x;
}
static boolean isEven(int n){
return (n & 1) == 0;
}
//测试奇偶运算的效率
public void testEven() {
// 位运算方式判断奇偶性
long t1 = Instant.now().toEpochMilli();
for (int i = 0; i < 1000000000; i++) {
boolean isEven1 = (i & 1) == 0;
}
System.out.println(Instant.now().toEpochMilli() - t1);
// 除以2取余方式判断奇偶性
long t2 = Instant.now().toEpochMilli();
for (int i = 0; i < 1000000000; i++) {
boolean isEven2 = i % 2 == 0;
}
System.out.println(Instant.now().toEpochMilli() - t2);
}
public static void main(String args[]){
Integer arr[]={1,2,3,4,5,6,7,8,9,10,11};//必须是已经排序好的,不重复的数组
int rt=BinarySearch.binarySearch(arr,5);//进行二分查找
System.out.println("二分查找到的下标:"+rt);
//JAVA math包的幂运算方法
double d= Math.pow(2, 64);
System.out.println(d);
//手写的幂运算方法
double d1= BinarySearch.pow(2, 64);
System.out.println(d1);
}
}