死磕算法之二分查找法

学习更多算法系列请参考文章:死磕算法之汇总篇

二分查找又称折半算法,此算法作为一个经典的查找算法是我们不得不掌握的算法

这个算法查找的前提是查找的数据是有序的,我们以数组为例,使用二分查找法进行查找的时候我们应该先定义三个字段:

1.left指向数组第一个数据

2.right指向数组最后一个元素

3.mid呢指向(left+right)/2位置的元素,就是他们中间的位置。

当我们要在一个数组中查找一条数据a时,有这么几个步骤:

  1. 首先我们拿a与mid比较,如果a与mid相等那么我们就成功找到了这个数据,程序停止。
  2. 如果a比mid小进行第3步,如果a比mid大进行第4步
  3. 既然a小于mid,那么mid与right之间的数肯定比a大,所以我们忽略它们,紧接着把right指向mid的前一个位置。(你可能会问为啥指向前一个位置不指向mid呀,因为我们已经确定了mid不等于a,那么我们就不需要在比较他了)
  4. 既然a大于mid,那么mid与left之间的数肯定比a小,所以我们忽略它们,紧接着把left指向mid的后一个位置。(不明白可以参考3哦)
  5. 如果left不大于right那么我们就还没有查找完毕,继续进行第一步。如果left已经大于了right,那么就代表在这个数组里我们没有找到想要的数据。

建议对二分查找不太熟悉的同学可以先在草稿纸上、电脑上或者脑海里定义一个0-16的有序数组跟着上边的步骤来查找一下数据5。

下面这个图是我画的图,来看一下跟你画的步骤或者想象的步骤一样么

如果上图你已经看明白了的话那么接下来我们就上代码吧,

public static void select(int[]num,int a){
    int left=0;
    int right=num.length-1;
    int m=(left+right)/2;
    while(left<=right){
        if(num[m]==a){
            System.out.println("在"+m+"位置找到");
            return;
        }
        if (num[m]>a){
            right=m-1;
        }else{
            left=m+1;
        }
        m=(left+right)/2;
    }
    System.out.println("没找到");
}

上面的方法使用了一个普通的循环的方式,二分还存在一种递归的写法,这里也分享出来

public static void select(int[]num,int a,int left,int right){
    if(left>right){
        System.out.println("没找到");
        return;
    }
    int m=(left+right)/2;
        if(num[m]==a){
            System.out.println("在"+m+"位置找到");
            return;
        }
        if (num[m]>a){
            right=m-1;
            select(num, a,left,right);
        }else{
            left=m+1;
            select(num, a,left,right);
        }
}

二分查找法讲到这里已经讲完了。在这里温馨提示大家,学习算法时,我们没必要拘泥于代码的实现,那没有意义。我的建议就是深入理解步骤,当你理解步骤以后代码是随你怎么玩都可以的。

原文地址:https://www.cnblogs.com/zhixiang-org-cn/p/9245649.html

时间: 2024-08-24 17:30:42

死磕算法之二分查找法的相关文章

Java学习 (七)、数组,查找算法,二分查找法,冒泡排序,选择排序,插入排序

一.常用数组查找算法 工作原理:它又称为顺序查找,在一列给定的值中进行搜索,从一端的开始逐一检查每个元素,知道找到所需元素的过程. 例1:查找指定的数在数组中出现的位置,找到返回下标,找不到返回-1 1 import java.util.Scanner; 2 public class LinearSearch{ 3 public static void main(String []argas) 4 { 5 int [] array={10,100,90,65,80,92}; 6 System.o

常见算法之二分查找法

public class BinarySearch { public static void main(String[] args) { int[] a = {1,2,3,4,5,6,7,8,9}; int binarySerach = binarySerach(a, 4); System.out.println(binarySerach); } public static int binarySerach(int[] a, int key) { int low = 0; int high =

死磕算法之汇总篇

死磕算法之二分查找法 死磕算法之选择排序 死磕算法之插入排序 死磕算法之快速排序 死磕算法之堆排序 死磕算法之希尔排序 死磕算法之冒泡排序 持续更新中............ 原文地址:https://www.cnblogs.com/zhixiang-org-cn/p/9248986.html

冒泡排序法与二分查找法

冒泡排序(Bubble Sort) 是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名. 算法原理 冒泡排序算法的运作如下:(从后往前) 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该

查找算法:二分查找、顺序查找

08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/details/7747205 查找算法 查找算法是在存在的序列(list) 中查找特定的目标(target),要求序列中每个记录必须与一个关键词(key)关联才能进行查找. 查找算法通常需要两个输入: 1.被查找的序列 2.要查找的关键词 查找算法的输出参数和返回值: 1.返回类型为 Error_co

php 二分查找法算法详解

一.概念:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功. 二.代

【C/C++学院】0723-32位与64位/调戏窗口程序/数据分离算法/内存检索/二分查找法/myVC

[送给在路上的程序员] 对于一个开发者而言,能够胜任系统中任意一个模块的开发是其核心价值的体现. 对于一个架构师而言,掌握各种语言的优势并阿赫利运用到系统中,由此简化系统的开发,是其架构生涯的第一步. 对于一个开发团队而言,能在短期内开发出用户满意的软件系统是起核心竞争力的体现. 每一个程序员都不能固步自封,要多接触新的行业,新的技术领域,突破自我. 32位与64位 地址与内存的关系 4G = 4*1024M = 4*1024*1024k = 4*1024*1024*1024 Byte字节 =

算法导论第2章 分治法与归并排序, 二分查找法

分治策略:将原问题划分成n个规模较小而结构与原问题相似的子问题,然后递归地解决这些子问题,最后再合并其结果,就可以得到原问题的解. 它需要三个步骤: 分解:将原问题分解成一系列的子问题. 解决:递归地解决各个子问题.若子问题足够小,则直接求解. 合并:将子问题的结果合并成原问题的解. 通过分治策略和分治步骤,可以简单地默出归并算法. 分解:将n个元素分成各自包含n/2个元素的子序列 解决:用归并排序法递归地对两个子序列进行排序. 合并:合并两个以排序的子序列,得到排序结果: void merge

Java-数据结构与算法-二分查找法

1.二分查找法思路:不断缩小范围,直到low <= high 2.代码: 1 package Test; 2 3 import java.util.Arrays; 4 5 public class BinarySearch { 6 7 public static void main(String[] args) { 8 int [] a = {1,5,7,9,11,12,16,20}; 9 int target = 16; 10 //System.out.println(Arrays.binar