java中的 二分查找
2016-03-04 18:36
501 查看
以下代码是参考网上的,然后自己改了一点
package sorter;
import java.util.Comparator;
/**
* 上面的代码中给出了折半查找的两个版本, 一个用递归实现,一个用循环实现。
*
* @className: Sorter2
* @description:
* @author: singleton-zw
* @createDate: 2016年3月4日-下午5:36:08
* @version: v1.0
* @Copyright (c)-2016
*/
public class Sorter2 {
/**
* 折半查找 需要注意的是 源数据必须的有序的 这里使用了 Comparator 来排序
*
* @methodsDescription:
* @methodName: main
* @param args
* @author: singleton-zw
* @return: void
*/
public static void main(String[] args) {
Integer score[] = { 67, 69, 11, 98, 75, 87, 89, 10, 99, 100 };
int score1[] = { 67, 69, 75, 87, 89, 99, 100 };
Comparator<Integer> comp = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// 使用默认的排序方法
return 0;
}
};
int binarySearch = binarySearch(score, 10, comp);
System.out.println("该数据位于:" + (binarySearch + 1));
System.out.println(BiSearch(score1, score1.length, 87));
}
public static <T extends Comparable<T>> int binarySearch(T[] x, T key) {
return binarySearch(x, 0, x.length - 1, key);
}
// 使用循环实现的二分查找
public static <T> int binarySearch(T[] x, T key, Comparator<T> comp) {
int low = 0;
int high = x.length - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
int cmp = comp.compare(x[mid], key);
if (cmp < 0) {
low = mid + 1;
} else if (cmp > 0) {
high = mid - 1;
} else {
return mid;
}
}
return -1;
}
// 使用递归实现的二分查找
private static <T extends Comparable<T>> int binarySearch(T[] x, int low, int high, T key) {
if (low <= high) {
int mid = low + ((high - low) >> 1);
if (key.compareTo(x[mid]) == 0) {
return mid;
} else if (key.compareTo(x[mid]) < 0) {
return binarySearch(x, low, mid - 1, key);
} else {
return binarySearch(x, mid + 1, high, key);
}
}
return -1;
}
/**
*
* @methodsDescription:
* @methodName: BiSearch
* @param r
* 数据源 必须是有序的
* @param n
* 数据个数
* @param k
* 查询的关键字
* @return
* @author: singleton-zw
* @return: int 位于第几个
*/
static int BiSearch(int r[], int n, int k) {
int low = 0;
int high = n - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (r[mid] == k)
return mid;
else if (r[mid] < k)
low = mid + 1;
else
high = mid - 1;
}
return -1;
}
}
package sorter;
import java.util.Comparator;
/**
* 上面的代码中给出了折半查找的两个版本, 一个用递归实现,一个用循环实现。
*
* @className: Sorter2
* @description:
* @author: singleton-zw
* @createDate: 2016年3月4日-下午5:36:08
* @version: v1.0
* @Copyright (c)-2016
*/
public class Sorter2 {
/**
* 折半查找 需要注意的是 源数据必须的有序的 这里使用了 Comparator 来排序
*
* @methodsDescription:
* @methodName: main
* @param args
* @author: singleton-zw
* @return: void
*/
public static void main(String[] args) {
Integer score[] = { 67, 69, 11, 98, 75, 87, 89, 10, 99, 100 };
int score1[] = { 67, 69, 75, 87, 89, 99, 100 };
Comparator<Integer> comp = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// 使用默认的排序方法
return 0;
}
};
int binarySearch = binarySearch(score, 10, comp);
System.out.println("该数据位于:" + (binarySearch + 1));
System.out.println(BiSearch(score1, score1.length, 87));
}
public static <T extends Comparable<T>> int binarySearch(T[] x, T key) {
return binarySearch(x, 0, x.length - 1, key);
}
// 使用循环实现的二分查找
public static <T> int binarySearch(T[] x, T key, Comparator<T> comp) {
int low = 0;
int high = x.length - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
int cmp = comp.compare(x[mid], key);
if (cmp < 0) {
low = mid + 1;
} else if (cmp > 0) {
high = mid - 1;
} else {
return mid;
}
}
return -1;
}
// 使用递归实现的二分查找
private static <T extends Comparable<T>> int binarySearch(T[] x, int low, int high, T key) {
if (low <= high) {
int mid = low + ((high - low) >> 1);
if (key.compareTo(x[mid]) == 0) {
return mid;
} else if (key.compareTo(x[mid]) < 0) {
return binarySearch(x, low, mid - 1, key);
} else {
return binarySearch(x, mid + 1, high, key);
}
}
return -1;
}
/**
*
* @methodsDescription:
* @methodName: BiSearch
* @param r
* 数据源 必须是有序的
* @param n
* 数据个数
* @param k
* 查询的关键字
* @return
* @author: singleton-zw
* @return: int 位于第几个
*/
static int BiSearch(int r[], int n, int k) {
int low = 0;
int high = n - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (r[mid] == k)
return mid;
else if (r[mid] < k)
low = mid + 1;
else
high = mid - 1;
}
return -1;
}
}
相关文章推荐
- 深入理解Java的接口和抽象类
- java-脚本-编译-注解
- JNI调用native方法出现 java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()异常的解决办法
- Java自动装箱与拆箱
- JAVA中string.replace()和string.replaceAll()的区别及用
- 【Java开发者自学笔记】前言
- java并发编程实践学习(2)--对象的组合
- myeclipse无法找到JPEGImageEncoder问题
- java学习笔记-java集合类
- 关于java中static的应用及一种常见错误
- 使用$.post 提交表单并且返回值方法
- Eclipse中快捷键Ctrl + Alt + 向上箭头 或者 Ctrl + Alt + 向下箭头与Windows冲突
- IDEA 创建基于Maven的spring mvc框架
- openjdk.net网站发布的一项Java增强提案
- myeclips报错:!MESSAGE Unhandled event loop exception !STACK 0 java.lang.OutOfMemoryError: unable to cr
- javabean中的boolean 类型属性命名
- 关于编码的碎碎念.md
- Java递归实现字符串的倒序输出
- Java设计模式之责任链模式
- Javac编译过程