二分查找法的 Java 实现(Binary Search)
I. 二分查找法原理
首先说基本查找,基本查找是从一个无序的数组中,从头到位挨个查找,找到就返回,找不到就返回 -1;
不同于基本查找,基本查找当输入规模非常大的时候,挨个查找效率非常低,所以二分查找这里就是为了解决基本查找效率低下的问题而提出的。
二分查找: 也叫折半查找,首先要将数组排序,然后用待查找元素和待查找数组的中间元素相比较,看待查找元素在左右哪个范围里,然后丢弃掉不需要的那一半,这样,每次查找就相当于少了一半的范围。这样效率有着极大的提升,时间复杂度是 O(log n)。
简而言之,就是和中间值比较大小,缩小一半范围
II. Java 代码实现
package org.lovian.search;
/**
* Binary search
* @author PENG Zhengshuai
* @lovian.org
*/
public class BinarySearch {
public static void main(String[] args) {
int[] array = { 76, 23, 49, 28, 48, 10, 3, 97, 65 };
int target1 = 65;
int target2 = 24;
// sort array
bubbleSort(array);
printArray(array);
// binary search
System.out.println("index of 65: " + binarySearch(array, target1));
System.out.println("index of 24: " + binarySearch(array, target2));
}
public static int binarySearch(int[] array, int target){
int index = -1; // default index of target
int min = 0; // min index
int max = array.length - 1; // max index
int mid = (min + max)/2; // mid index
while(min < max){
if(target == array[mid]){
// find target, return
return mid;
}else if(target < array[mid]){
// target in left side
max = mid - 1; // shrink the max
mid = (min + max)/2; // update mid index
}else if(target > array[mid]){
// target in right side
min = mid + 1; // reset the min
mid = (min + max)/2; //update mid index
}
}
return index;
}
public static void bubbleSort(int[] array) {
boolean sorted = false;
int n = array.length - 1;
while (!sorted) {
sorted = true;
for (int i = 0; i < n; i++) {
if (array[i] > array[i + 1]) {
swap(array, i, i + 1);
sorted = false;
}
}
n--;
}
}
public static void swap(int[] array, int src, int des) {
int tmp = array[src];
array[src] = array[des];
array[des] = tmp;
}
public static void printArray(int[] array) {
System.out.print("[");
for (int i = 0; i < array.length; i++) {
if (i != array.length - 1) {
System.out.print(array[i] + " ,");
} else {
System.out.print(array[i] + "]");
}
}
System.out.println();
}
}
result:
[3 ,10 ,23 ,28 ,48 ,49 ,65 ,76 ,97]
index of 65: 6
index of 24: -1
注意,这里改变了数组的原有索引,所以一般对于无序数组,用基本查找。但是这个思想可以应用于某些特定的需求,
Share this on