二分搜索算法(配合例题详细讲解)

题目:给定数组a[0 : 8]={1, 8, 12, 15, 16, 21, 30, 35, 39}。采用二分搜索算法完成下述任务:

  1. 查找是否有元素30,若有返回元素在数组中的位置;如没有返回无此元素。
  2. 查找是否有元素20,若有返回元素在数组中的位置;如没有返回无此元素。
  3. 当待搜索元素x=10不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j

二分搜索算法、快速排序-算法分析与设计实验3(有完整详细的解答!!!欢迎下载!!!)-Java文档类资源-CSDN下载一次大学算法分析与设计的实验报告作业!!!题目内容设计二分搜索算法、顺序搜索算法、快速排序及性能分更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/weixin_51620201/85005219

比较赶时间的朋友可以点击上面的链接哦!下载观看,有完整的解题思路和代码,例题更多!!!

目录

一、基本思路         

二、实现代码

三、详细的解题 

第一题:

 第二题:

第三题:

四、完整代码:

一、基本思路         

        二分搜索算法的思想很简单,先理解一下题目,我们需要在数组a[0 : 8]={1, 8, 12, 15, 16, 21, 30, 35, 39}中查找到一个元素,找到了就返回该元素在数组中的位置(即下标),找不到就返回无此元素,好啦,我们要做的事情就一目了然啦!!

        很关键的一个点,不知你有没有发现,题目给出的数组是一个已经按递增排序好的数组,对于这么一个数组,如果利用顺序搜索算法查找的话,在最坏情况下,就需要比较n次(n为元素的个数),在最好情况下,只需要比较一次,那么平均时间复杂度为O(n)。但如果用二分搜索算法的话,每一次比较后,数组的长度就会减半,在最坏的情况下时间复杂度为O(logn),在最好的情况下,同样是只需要比较一次,平均时间复杂度为O(logn)。

        所以这题用二分搜索算法是一个比较好的选择!!!

基本思想:把数组分成划分成相对平均的两半,令middle=(left+right)/2,初始化left=0,right=n-1.把待查找元素x与a[middle]对比,若x==a[middle],则查找完毕!

        若x>a[middle],则目标元素可能在右边的数组,数组长度减半,令left=middle+1,再进行x与a[middle]的比较,直到递归查找结束!

        若x<a[middle],则目标元素可能在左边的数组,数组长度减半,令right=middle-1,再进行x与a[middle]的比较,直到递归查找结束!

有理论知识的支持,自然我们的代码就不难写啦!!!

二、实现代码

二分搜索算法:

  public static int binarySearch(int[] a,int x)   //二分折半搜素算法    {        int n=a.length;        int left=0;        int right=n-1;        while(left<=right)        {            int middle=(left+right)/2;      //middle为中间元素            if(x==a[middle]) return middle; //查找成功,返回结果            if(x>a[middle]) left=middle+1;  //要查找的x在数组的右边            else right=middle-1;            //要查找的x在数组的左边        }        return -1;      //找不到x,返回-1    }

你看,是不是很简单??? 

在第三小题中,我配合了顺序搜索算法来进行元素的查找,为了性能的更优!!!

  public static int sequenceSort(int[] a,int x)   //顺序搜索算法    {        int i;        for(i=0;i<a.length;i++)                 if(x>a[i] && x<a[i+1])      //查找比10小的最大元素下标                return i;        return i;       }

三、详细的解题 

第一题:

查找是否有元素30,若有返回元素在数组中的位置;如没有返回无此元素。

运行代码:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p2l546l5pa56ZW_,size_19,color_FFFFFF,t_70,g_se,x_16

 第二题:

查找是否有元素20,若有返回元素在数组中的位置;如没有返回无此元素。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p2l546l5pa56ZW_,size_12,color_FFFFFF,t_70,g_se,x_16 

第三题:

当待搜索元素x=10不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p2l546l5pa56ZW_,size_11,color_FFFFFF,t_70,g_se,x_16

 

四、完整代码:

import java.util.Scanner;public class Search       //搜素算法{    public static int binarySearch(int[] a,int x)   //二分折半搜素算法    {        int n=a.length;        int left=0;        int right=n-1;        while(left<=right)        {            int middle=(left+right)/2;      //middle为中间元素            if(x==a[middle]) return middle; //查找成功,返回结果            if(x>a[middle]) left=middle+1;  //要查找的x在数组的右边            else right=middle-1;            //要查找的x在数组的左边        }        return -1;      //找不到x,返回-1    }    public static int sequenceSort(int[] a,int x)   //顺序搜索算法    {        int i;        for(i=0;i<a.length;i++)                 if(x>a[i] && x<a[i+1])      //查找比10小的最大元素下标                return i;        return i;       }    public static void main(String[] args)    {        int a[] = {1, 8, 12, 15, 16, 21, 30, 35, 39};        System.out.println("请输入一个你想查找的整型元素:");        Scanner reader=new Scanner(System.in);      //键盘输入想要查找的元素        int x=reader.nextInt();        int i=binarySearch(a, x);        if(i!=-1)        {            System.out.println("元素"+x+"已经找到!");            System.out.println(x+"在数组中的下标为"+binarySearch(a,30));        }        else        {            System.out.println("没有"+x+"此元素!");            if(x==10)                               //由于原数组是已经排好序的,可以利用顺序搜索查找            {                System.out.println("小于元素"+x+"的最大元素的下标为"+sequenceSort(a,x));                System.out.println("大于元素"+x+"的最小元素的下标为"+(sequenceSort(a,x)+1));            }        }    }}

 创作不易,谢谢支持!!三连(点赞、关注、收藏),必回!!!

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来玥方长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值