折半查找,也称二分查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。
2017-05-14 17:28
846 查看
import java.util.Comparator; /** * 排序器接口(策略模式: 将算法封装到具有共同接口的独立的类中使得它们可以相互替换) * @author骆昊 * */ public interface Sorter { /** * 排序 * @param list 待排序的数组 */ public <T extends Comparable<T>> void sort(T[] list); /** * 排序 * @param list 待排序的数组 * @param comp 比较两个对象的比较器 */ public <T> void sort(T[] list, Comparator<T> comp); }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.Comparator; /** * 冒泡排序 * * @author骆昊 * */ public class BubbleSorter implements Sorter { @Override public <T extends Comparable<T>> void sort(T[] list) { boolean swapped = true; for (int i = 1, len = list.length; i < len && swapped; ++i) { swapped = false; for (int j = 0; j < len - i; ++j) { if (list[j].compareTo(list[j + 1]) > 0) { T temp = list[j]; list[j] = list[j + 1]; list[j + 1] = temp; swapped = true; } } } } @Override public <T> void sort(T[] list, Comparator<T> comp) { boolean swapped = true; for (int i = 1, len = list.length; i < len && swapped; ++i) { swapped = false; for (int j = 0; j < len - i; ++j) { if (comp.compare(list[j], list[j + 1]) > 0) { T temp = list[j]; list[j] = list[j + 1]; list[j + 1] = temp; swapped = true; } } } } }
import java.util.Comparator;public
class MyUtil { 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; }}
相关文章推荐
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
- 插入元素到有序数组,二分搜索查找插入位置
- KT学算法(二)——循环有序数组查找指定元素
- 在相邻元素相差1的数组中查找某一特定元素第一次出现的位置
- 二分查找 —— 有序数组不小于(不大于)某数的第一个(最后一个)元素
- 算法:有序数组删除重复元素,和查找等值键的问题
- 二分搜索典型应用(一)从有序数组中查找某个值
- 字符串算法——查找有序数组旋转后最小值(有重复元素)(Find Minimum in Rotated Sorted Array II)
- 算法3.2 二分查找(基于有序数组)(algs4)
- 利用二分法查找有序数组中某一元素
- 折半法(二分)搜索有序数列元素下标及数组传参问题
- 算法实验一:二分查找算法改进: 当搜索元素x不存在时,返回小于x的最大元素位置i和大于x的最小元素位置j. 当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
- 使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组
- 「算法」查找二分搜索树的第K个元素
- 设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。
- 算法-分割有序数组后查值-二分查找的变形
- 程序员面试题目总结--数组(二)【二分查找、找出给定数字出现次数、两个有序整型数组交集、找出数组中唯一的重复元素、判断数组中的数值是否连续相邻】
- 二分查找:在有序数组中搜索大于等于x的数的最小下标
- 【leetcode】搜索范围(二分查找升序数组target元素上下界)
- 详解Java数据结构和算法(有序数组和二分查找)