排序集和二分查找
1 .有序集合
二分搜索(也称为折半搜索)是一种非常重要和常用的搜索算法,多应用于平衡树和排序集合。 使用二分搜索是有前提条件的。 首先,确保集合时有排序集合,只能在排序集合中使用二分搜索。
各种各样的数据中,有些是天生就有顺序的。 例如,数字天生就具有自然排序的属性。 还有字符串等数据类型,也有一般的排序规则。 Java语言确定某种类型的数据是否具有可排序的属性,通常看其本身是否实现了Comparable接口(比较器接口)。 如果自定义数据类型实现了Comparable接口,则它也是具有自然排序的属性。
Comparable接口是需要实现“intcompareto(to )”抽象方法的通用接口,如果当前对象的值小于o,则返回负整数;否则返回正整数;如果两个值相等,则返回
在某些工具类容器中,为了避免接管通用接口,可以向容器中添加非Comparable实现类型,但必须添加定义了o1和o2比较规则的外部比较器Comparator对象这两种方法都确保自定义类型具有排序属性。
2 .二分搜索
二分搜索的思路非常简单,在一个序列的一半处开始搜索,根据比较的大小决定是向左还是向右继续搜索。 使用二分搜索算法时,通常需要定义三个比较索引,以限制搜索中的比较范围。
1 .左索引。 位于序列的最小元素中。
2 .权限索引。 位于数组的最大元素中。
3.middle索引,序列的中间位置。
的目标值target始终与middle进行比较,如果target大于middle,则left索引移动到middle 1,然后middle索引移动到(left right )/2。
如果target小于middle,则right索引移动到middle-1,然后middle索引移动到(左右)/2。 如果左边缘索引大于右边缘,则搜索结束。 如果搜索结束后在规则集合中找不到target值,则表明该集合中没有target值,如下图所示。
二分搜索算法
在Java中设计排序集合时,可以使用二分查找算法。 我们不需要从头设计全新的线性集合,可以在ArrayList的基础上改造为排序集合,添加二分搜索方法。 由于ArrayList本身不是排序集合,因此需要覆盖它的add方法来确保进入容器的数据有序。 示例代码如下。
改造后的SortList变成了自然的排序集合。 可以随机生成一些数据,以测试经过修改的SortList是否可以自动对元素进行排序,以及新添加的二分查找方法是否可以找到所需的数据。
执行结果:
上述例子的运行结果可以验证我们改造的排序集合是有效的(可以自己添加功能测试用例,验证代码的健壮性)。 您也可以自定义几个类,以查看修改后的SortList是否有效。 以下示例创建了一个学生成绩班TestScores,用于定义比较规则。 在测试中,将多个学生的成绩放入SortList中,调查是否能取得自动排序的效果。
执行结果:
从运行结果来看,取得了我们期望的效果。 另外,利用findInsertIndex法可以实现一些统计效果。
虽然Java中存在类似的排序集合(TreeMap、TreeSet等),但是对于二分搜索这样的基础算法,还是需要学习。