package com.aozhi.test;
public class BinarySearch {
/*
* 循环实现二分查找算法arr[] 已排好序的数组x
* return 返回索引下标
*/
public static int binarySearch(int[] arr, int x) {
int low = 0;
int high = arr.length - 1;
while (low <= high) {//判断非空
int middle = (low + high) / 2;//折半从中间开始
if (x == arr[middle]) {//是中间的直接返回
return middle;
} else if (x < arr[middle]) {//因为他是有序的数组,可以根据中间值作比较
high = middle - 1;
} else {
low = middle + 1;
}
}
return -1;
}
public static void main(String[] args) {
int[] arr = { 6, 12, 33, 87, 90, 97, 108, 561 };
System.out.println("循环查找:" + (binarySearch(arr, 6)));
}
}
二分查找也称折半查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
pdl二分查找充分利用了序列元素的递增性质,采用分治策略搜索目标值(目标值存在于序列中),目标值的左边界和右边界(目标值不存在于序列中),其中左边界指的是最大的小于目标值的元素,右边界指的是最小的大于目标值的元素。
二分查找法最坏情况
n个数, 比较中间的数,一次去掉一半,余下n/2个
n/2个数, 再比较中间的数,一次去掉一半,余下n/4个
n/4个数, 再比较中间的数,一次去掉一半,余下n/8个
n/8个数, 再比较中间的数,一次去掉一半,余下n/16个
顺序查找的基本思想:
就是遍历整个列表,逐个进行记录的关键字与给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录。如果直到最后一个记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找失败。
二分查找的基本思想是:
在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到找到为止。
二分查找和分块查找顺序查找相当于遍历数组的所有元组,所以不需要排序二分查找需要排序,因为每次都是和中间值比较,如果大于选中间值后面的部分继续二分查找,如果小于中间值则选前面的部分继续执行分块查找中需要按照数值大小进行排序分块,虽然每个块中的大小可以不排序,但是块的取值区间是排序的。
二分查找算法是一种快速的查找算法。当我们再一个数组中查找是否存在某个数时,通常是直接遍历这个数组直到找到这个数,时间复杂度为O(n)试想如果数据量很大,这里可以用一种简单快速的的查找算法--二分查找算法,也叫做折半查找算法。
要求如下: 1、待查找序列有序(关键字递增或者递减有序) 2、顺序存储(也就是数组连续存放,便于按下标或者序号随机访问)
二分查找操作的数据集是一个有序的数据集。开始时,先找出有序集合中间的那个元素。如果此元素比要查找的元素大,就接着在较小的一个半区进行查找;反之,如果此元素比要找的元素小,就在较大的一个半区进行查找。在每个更小的数据集中重复这个查找过程,直到找到要查找的元素或者数据集不能再分割。
二分查找能应用于任何类型的数据,只要能将这些数据按照某种规则进行排序。然而,正因为它依赖于一个有序的集合,这使得它在处理那些频繁插入和删除操作的数据集时不太高效。这是因为,对于插入和操作来说,为了保证查找过程正常进行,必须保证数据集始终有序。相对于查找来说,维护一个有序数据集的代价更高。此外,元素必须存储在连续的空间中。因此,当待搜索的集合是相对静态的数据集时,此时使用二分查找是最好的选择。
因为二分查找可以很有效的缩短查找时间,提高查找效率,非常实用的方法
本网站文章仅供交流学习,不作为商用,版权归属原作者,部分文章推送时未能及时与原作者取得联系,若来源标注错误或侵犯到您的权益烦请告知,我们将立即删除