折半查找法

C:折半查找法(二分法)

▼魔方 西西 提交于 2020-03-24 02:08:07
  主要用于已经做了排序的数字,时间复杂度:log2n   直接贴代码 #include <stdio.h> #include <stdlib.h> int search(int search_num, int a[], int right) { int left = 0; int ret = -1; int mid; while(right > left) { mid = (right + left) / 2; if (a[mid] == search_num) { ret = mid; break; } else if (a[mid] > search_num) { right = mid - 1; } else { left = mid + 1; } } return ret; } int a[9] = {1, 3, 5, 6, 8, 10, 12, 15, 17}; int main() { /*二分法搜索方法 思路: 1.设置左标和右标,建立search函数做二分运算 2.函数建立 循环终止条件是当right > left mid由(right + left) / 2得到 if mid = 所求; break if else mid > 所求; left = mid + 1 else mid < 所求 right = mid - 1 1, 3, 5, 6, 8, 10,

折半查找(二分)法

。_饼干妹妹 提交于 2020-01-25 11:12:08
折半查找法:从数组的中间元素开始,如果中间元素正好等于要查找的元素,则搜索过程结束;如果要查找的元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。 注意折半查找要求数组是有序的。 现在有如下数组: 如果要使用折半查找法那么我们应该先将数组排序,在这里我们可以用Arrays类里面的sort方法。 排序后: 假设我们要查找元素7,那么我们第一步找到的中间元素为:array[3]【下标(max+min)/2】 我们可以发现要找的元素7>中间元素4,因此我们可以只关注右边,左边的元素可以忽略它们。 接下来我们需要找下次查找的中间元素,因为我们只需要关注右边的元素,所以我们可以讲min向右边移动 通过公式求得中间元素mid=(min+max)/2=5(5为下标) 可见需要找的元素7还是比mid的值大,因此还需要继续关注右边继续移动mid 这次我们可以发现终于找到我们需要找的元素啦!!! 这就是折半的过程啦嘻嘻嘻!! 代码如下: import java . util . Arrays ; public class HalfSearch { public static void main ( String [ ] args ) { int array [ ] = { 1 , 4 , 2 , 3 , 6 ,

查找-二分法查找(折半查找法)

£可爱£侵袭症+ 提交于 2019-12-18 08:47:14
实现查找指定数值在 元素有序的数组 中存储的位置(索引),返回该位置(索引)。 解题步骤: 1.定义3个用来记录索引值的变量,变量min记录当前范围最小索引值,初始值为0;变量max记录当前范围最大索引值,初始值为数组长度-1;变量mid记录当前当前范围最中间元素的索引值,初始值为(min+max) / 2 2.使用循环,判断当前范围下,最中间元素值与指定查找的数值是否相等 若相等,结束循环,返回当前范围最中间元素的索引值mid 若不相等,根据比较结果,缩小查询范围为上一次查询范围的一般 中间元素值 比 要查询的数值大,说明要查询的数值在当前范围的最小索引位置与中间索引位置之间,此时,更新查询范围为: 范围最大索引值 = 上一次中间索引位置 -1; 中间元素值 比 要查询的数值小,说明要查询的数值在当前范围的最大索引位置与中间索引位置之间,此时,更新查询范围为: 范围最小索引值 = 上一次中间索引位置 +1; 在新的查询范围中,更新中间元素值的位置,再次使用最中间元素值与指定查找的数值是否相等。 中间索引值 = (范围最小索引值 +范围最大索引值) / 2; 3.每次查询范围缩小一半后,使用if语句判断,查询范围是否小于0个元素,若小于0个元素,则说明指定数值没有查询到,返回索引值-1。 //二分查找法(折半查找法) public static int halfSearch(int