二分查找
一、定义:
二分查找又称为折半查找(Binary search),是一种效率较高的查找方法。它要求线性表的存储结构为顺序存储结构,并且表中的元素按照关键字排列。时间复杂度O(log2n)。
二、时间复杂度:
该算法的时间复杂度为O(log2n)。
三、算法思路:
假设要查找数组array[0...n](事先已按升序排好序)中的某一数值,首先设数组最低位为low=0,最高位为heigh=array.length-1,中间位置为mid=(array.length-1)/2。接着将待查找的Key值与array[mid].key进行比较,若相等,则查找成功并返回mid值;若不相等,则执行另外的操作:
(1)若Key<array[mid].key,则说明要查找的Key值在array[0..mid-1]右半区间,故要在array[0...mid-1]区间进行查找,则我们需要将最高位重新设置为height=mid-1,最低位不变,中间位要重新设置为mid=(height-low+1)/2;
(2)若Key>array[mid].key,则说明要查找的Key值在array[0..mid-1]左半区间,故要在array[mid+1...height]区间进行查找,则我们需要将最低位重新设置为low=mid+1,最高位不变,中间位要重新设置为mid=(height-low+1)/2;
以此类推,直至找到你要找到的那个数的数组下标为止,若没有则返回-1。
四、二分查找算法:
import java.util.Scanner;
public class Text {
public static void main(String [] args) {
int[] myArray = new int[10];
myArray[0] = 20;
myArray[1] = 10;
myArray[2] = 1;
myArray[3] = 3;
myArray[4] = 11;
myArray[5] = 62;
myArray[6] = 34;
myArray[7] = 54;
myArray[8] = 24;
myArray[9] = 13;
Scanner input = new Scanner(System.in);
System.out.println("请输入您要查找的数:");
int num = input.nextInt();
BubbleSort(myArray);
for(int i=0;i<myArray.length;i++) {
System.out.print(myArray[i]+" ");
}
//二分查找
System.out.println();
System.out.println("您要查找的数的数组下标为:"+BinarySearch(myArray,num));
}
public static int[] BubbleSort(int[] array){
//冒泡排序
for(int i=0;i<array.length-1;i++) {
for(int j=0;j<array.length-i-1;j++) {
if(array[j]>array[j+1]) {
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
return array;
}
public static int BinarySearch(int[] array,int num) {
int low = 0;
int mid = (array.length-1)/2;
int heigh = array.length-1;
//二分查找算法
while(low<=heigh) {
if(num==array[mid]) {
return mid;
}else if(num<array[mid]) {
heigh = mid-1;
mid = (heigh-low+1)/2;
}else {
low = mid+1;
mid = (heigh-low+1)/2;
}
}
return -1;
}
}