package com.duoduo.day316;
/**
* 分治法----二分搜索/查找
* 采用递归方法
* @author 多多
*
*/
import java.util.Scanner;
import java.util.*;
public class BinarySearch {
public static void main(String [] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入数列中的元素个数n:");
int n=sc.nextInt();
int [] arr=new int[n];
System.out.println("请依次输入数列中 的元素:");
for(int i=0;i<n;i++) {
arr[i]=sc.nextInt();
}
Arrays.sort(arr);
System.out.println("排序后的数组为:");
for(int i=0;i<n;i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
System.out.println("请输入要查找的元素:");
int key=sc.nextInt();
int i=binarySearch(arr, n,key);
if(i==-1)
System.out.println("该数列中没有要查找的元素");
else
System.out.println("要查找的元素在第"+(i+1)+"位");
}
/*二分查找功能函数*/
private static int binarySearch(int [] arr , int n, int key) {
int low=0;
int high=n-1;
while(low<=high) {
int middle=low+((high-low)>>1);
if(arr[middle]==key)
return middle;
else if(arr[middle] >key)
high=middle-1;
else
low=middle+1;
}
return -1;
}
}
时间复杂度:
n=1 O(1)
n>1 特定元素与中间元素进行比较 O(1)
T(n)=2T(n/2)+O(1)
=T(n/2的x次方) + xO(1)
最后为1 n=2* x=logn T(n)=O(logn)
空间复杂度 O(1) 常量
int i=recursionBS(arr,key,0,n-1);
if(i==-1)
System.out.println("该数列中没有要查找的元素");
else
System.out.println("要查找的元素在第"+(i+1)+"位");
/*采用递归方法进行查找*/
public static int recursionBS(int [] arr, int key, int low,int high) {
if(low >high)
return -1;
int middle=low+((high-low)>>1);
if(arr[middle]==key)
return middle;
else if(arr[middle]>key)
return recursionBS(arr,key,low,middle-1);
else
return recursionBS(arr,key,middle+1,high);
}
时间复杂度:
O(logn)
空间复杂度
O ( logn) 递归 从根到叶子经过节点 logn个 递归调用了logn次