二分查找算法的JAVA实现

来源:互联网 发布:淘宝伴侣怎么用 编辑:程序博客网 时间:2024/05/16 11:36

二分查找算法:

是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。折半搜索每次把搜索区域减少一半,时间复杂度为Ο(logn) 。

【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。

实现代码

package com.teradata.lsw.sort;


public class BinarySearch {


/**
* @param args

* @author TD_LSW
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = new int[] { 3, 5, 11, 17, 21, 23, 28, 30, 32, 50, 64, 78, 81,
95, 101 };
System.out.println(binarySearch(a, 11));
System.out.println(binarySearch(a, 21, 0, a.length - 1));


}


/**
* 二分查找的递归实现

* @param a
* @param e
* @param low
* @param high
* @return
*/
private static int binarySearch(int[] a, int e, int low, int high) {
// TODO Auto-generated method stub
int middle = (low + high) / 2;
while (low <= high) {
if (a[middle] == e) {
return middle;
} else if (a[middle] > e) {
return binarySearch(a, e, low, middle - 1);
} else {
return binarySearch(a, e, middle + 1, high);
}
}
return -1;
}


/**
* 二分查找的非递归实现

* @param a
* @param e
* @return
*/
private static int binarySearch(int[] a, int e) {
// TODO Auto-generated method stub
int low = 0;
int high = a.length - 1;
while (low <= high) {
int middle = (low + high) / 2;
if (a[middle] == e) {
return middle;
} else if (a[middle] > e) {
high = middle - 1;
} else {
low = middle + 1;
}
}
return -1;
}


}

折半查找的算法讨论:
优点:ASL≤log2n,即每经过一次比较,查找范围就缩小一半。经log2n 次计较就可以完成查找过程。
缺点:因要求有序,所以要求查找数列必须有序,而对所有数据元素按大小排序是非常费时的操作。另外,顺序存储结构的插入、删除操作不便利。
0 0
原创粉丝点击