二分法查找

java-二分法查找数组元素

江枫思渺然 提交于 2020-01-16 13:26:46
package com.rj.bd.lx; import java.util.Arrays; /** * @desc 数组元素的查找之二分法 * @author yhx * @time 2019-09-11 * */ public class ErFenFa { public static void main(String[] args) { int[] a = {123,235,45,6,7,9,95,4}; // 由于二分法适合已经排序好的数组所以先将数组进行排序 for (int i = 0; i < a.length-1; i++) { for (int j = 0; j < a.length-1-i; j++) { if(a[j+1]<a[j]){ int temp = a[j+1]; a[j+1] = a[j]; a[j] = temp; } } } System.out.println(Arrays.toString(a)); System.out.println(Search(a,6)); } private static int Search(int[] a, int value) { int low = 0; int high = a.length-1; while(low<high){ int mid=(low+high)/2; if(value==a[mid

二分法查找总结(一)

佐手、 提交于 2020-01-16 05:27:49
目录 题目描述 My Answer 总结 题目描述 实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 示例 1: 输入: 4 输出: 2 示例 2: 输入: 8 输出: 2 说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。 My Answer class Solution { public int mySqrt(int x) { if(x==0){ return 0; } if(x==1){ return 1; } int left=0; int right=x; while(left<right){ int middle=left+(right-left)/2; if(x/middle==middle){ return middle; }else if(x/middle>middle){ if(x/(middle+1)>middle+1){ left=middle; }else if(x/(middle+1)==middle+1){ return middle+1; }else if(x/(middle+1)<middle+1){ return middle; } }else{ right=middle; } } return -1;

C++ 一个简单的二分法查找

限于喜欢 提交于 2019-12-21 05:16:17
#include <iostream> #include <vector> using namespace std; int findBin(vector<int>& arr,int target){ int l=0,r=arr.size()-1; int mid; while(l<=r){ mid=(l+r)/2; if(arr[mid]==target) return mid; if(target<arr[mid]){ r=mid-1; } else{ l=mid+1; } } return -1; } int main() { int arr[]={1,2,4,5,7,8,10,12,13,18,24,29,54,321,777,785,988}; vector<int> arra(arr,arr+17); int num; while(1){ cin>>num; if(num==-1)return 0; cout<<findBin(arra,num)<<endl; } } 来源: CSDN 作者: 啊罗罗 链接: https://blog.csdn.net/dyyzlzc/article/details/103606148

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

£可爱£侵袭症+ 提交于 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

利用二分法查找一个数字在数组中的位置

匿名 (未验证) 提交于 2019-12-03 00:20:01
问题: 有一个升序排列无重复数字的数据,以及一个数字,利用二分法查找数字在数组中的位置,找到则返回其位置号,没找到返回-1. 解答: 通过两种方式实现:第一种方式为递归实现,需要传递数组的头和尾的位置。 [java] view plain copy public class /** public static int int int int int if null return 1 int 2 "中间值:" if if return 1 else if return else return else if return else return 1 /** public static void int 1 , 3 , 4 , 5 , 6 , 7 , 11 , 46 , 255 , 743 , 888 int 11 , 1 , 11 第二种实现方式为非递归实现,则利用循环: [java] view plain copy public class public static int int int if null return 1 int 2 if return 1 int 0 //数组下标 int 1 //数组下标 while 2 if else if else return 1 return 1 /** public static void int 1 , 3 , 4 , 5 , 6

算法:二分法查找

匿名 (未验证) 提交于 2019-12-02 21:52:03
package com.atguigu;public class Main { public static void main(String[] args) { //二分法查找 //前提:所查找的数组必须有序 int[] arr=new int[]{-98,-34,2,34,54,66,79,105,210,333}; int dest=-3; int head=0;//初始的首索引 int end=arr.length-1; boolean isFlag=true; while(head<=end){ int middle=(head+end)/2; if(dest==arr[middle]){ System.out.println("找到指定的元素,位置为"+middle); isFlag=false; break; }else if(arr[middle]>dest){ end=middle-1; }else{ head=middle+1; } } if(isFlag){ System.out.println("很遗憾,没有找到"); } }} 来源:博客园 作者: Java后端小白 链接:https://www.cnblogs.com/helloworld0903/p/11456552.html

算法 - 二分法查找

岁酱吖の 提交于 2019-12-02 15:28:47
什么是二分法查找 免费小说网站 https://www.kuwx.net/ 二分法查找主要是为了快速查找给定数组内,期待值在数组中的位置(下标) 二分法查找通过对整个数组取中间值,判断期待值所在的范围并缩小范围,每次查找范围折半,直到范围的边界重合,得出期待值的位置,如果找不到返回null 二分法有一个先决条件是:数组内元素必须是有序的 简单图解 给定一个包含1,3,5,7,8,9这一个元素的有序数组,求得期待值7所在的位置,下边用绿块表示指针所在位置 若是按照直接遍历的方式,绿块会从数组的第一个下标开始比较,直到7所在的下标得到结果,遍历需要4次,下边演示下二分法的图示 第一次 ,取值范围为整个数组,取数组长度中间值(0+5)/2取整2作为下标 取中间值初始以数组的第一个下标与最后一个下标相加取中间值,如果不为整,舍去小数部分 比较期待值与下标为2的值大小,发现5<7,7这个值应在中间值的右侧 缩小查找范围为中间值+1与最大下标 第二次 ,范围缩小为原数组的一半,下标不变,取中间值(3+5)/2=4 下标4对应的值8,大于7,所以向左取范围最小下标3,最大下标4-1=3 第三次 ,取中间值(3+3)/2=3,下标3上的值恰好与期待值相等,返回下标3 虽然看起来只少了一次,原因在数组的长度小,另外就是期待值设置的小, 再举个长一点的例子,这里有1-100的数组,100个元素

二分法查找法学习笔记总结

纵然是瞬间 提交于 2019-11-29 16:34:30
1 二分法学习笔记总结 参考 https://leetcode-cn.com/problems/search-insert-position/solution/te-bie-hao-yong-de-er-fen-cha-fa-fa-mo-ban-python-/ https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/er-fen-cha-zhao-suan-fa-xi-jie-xiang-jie-by-labula/ 1.1 取中位数索引的方法 传统的方法 int mid = (left + right) /2 ,在 left 和 right 比较大的时候, 两者相加很可能超过 int 类的最大值,即发现整型溢出; 改进 int mid = left + (right - left) /2 最好的写法 int mid = (left + right) >>> 1 >> , 右移时,丢弃右边指定位数,左边补上符号位; >>>, 无符号右移运算符 ,丢弃右边指定的位数,左边补上 0 。所以对负数右移,可以变成正数; 1.2 循环条件 while (left <= right) ,退出循环时,要考虑返回 left 和 right; 2

二分法查找(折半查找)算法学习笔记

泪湿孤枕 提交于 2019-11-29 16:34:00
关键:数组中的元素必须是已经排好序的. 一维数组,二分法查找: 假如有一组数为1,2,3,4, 5 ,6,7, 8, 9, 10要查给定的值7.可设三个变量low,mid,high分别指向数据的前,中间和后,mid=(low+high)/2. 思路: 1:将low=0,值为1;high=9,值为10(因为数组下标从0开始);mid=(low+high)/2,即等于4,值为32(因为整型会省略小数点); 2:将mid的值与查找的数作比较,如果mid<n(这里假设要查找的数为n),说明n在mid的后边,则使得low=mid+1,high不变;如果n<mid,说明n在mid的前边,则使得high=mid-1,low不变;如果mid==n,你懂的... 3:现在的mid等于4,值为5,查找的范围为:5,6,7,8,9,10,显然mid<n,此时mid执行2次循环便等于7,然后输出mid. 例如: 设计一个程序,提供用户输入10个整数并保存到数组中,将整数以从大到小的顺序排列,最后通过半分法查找用户输入的值并显示值的序号.(VC++6.0环境) 代码清单: /******************************************************** ************************半分法查找*********************** ********

二分法查找 算法学习笔记

丶灬走出姿态 提交于 2019-11-29 16:31:17
二分法查找 学习笔记 文章目录 二分法查找 学习笔记 二分法简介 这种方法的基本思路如下: 主程序如下 二分法简介 二分法查找,是一种在已经 排好顺序 的数组中查找特定元素的方法。 这种方法的基本思路如下: 数组a[],所寻找的特定元素x。 1、设3个指针: l:指向数组第一个数。 h:指向数组中间数(h = (l + r) / 2)。 r:指向数组最后的数。 2、将x与a[h]作比较, (1) 若a[h] > x :将r指针向前移到h-1; (2) 若a[h] < x :将l指针向后移到h+1; 3、重新定义h指针:h = (l + r) / 2。 将上述步骤写入循环里,当 l < r - 1 时,退出循环。 主程序如下 int l , h , r , num [ m ] , x ; //x为特定元素,m为数组大小 l = 0 ; r = m - 1 ; while ( l < r - 1 ) { h = ( l + r ) / 2 ; if ( x == num [ h ] ) { printf ( "%d" , h ) ; return 0 ; } else if ( x > num [ h ] ) { l = h + 1 ; } else { r = h - 1 ; } } 来源: CSDN 作者: 摇啊摇曳瑶 链接: https://blog.csdn.net