精华内容
下载资源
问答
  • 实验 折半查找算法
    2017-06-20 16:01:07

    掌握折半查找算法的思想及程序实现。

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    typedef struct BSearch{
        int elem[20];
    public:
        void ini(){
            for(int i=0;i<20;i++) elem[i]=rand()%91;
            sort(elem,elem+20);
        }
        int Find(int x){
            int l=0,r=19,mid;
            while(l+1<=r){
                mid=(l+r)/2;
                if(elem[mid]<x){
                    l=mid+1;
                }else
                    r=mid;
            }
            return l;
        }
        void show(){
            for(int i=0;i<20;i++)
                cout<<elem[i]<<' ';
            cout<<endl;
        }
    }BSearch;
    int main()
    {
        srand((unsigned long long)time(0));
        BSearch a;
        a.ini();
        a.show();
        int x,t;
        while(cin>>x){
            cout<<a.Find(x)<<endl;
        }
    }
    


    更多相关内容
  • 主要介绍了PHP实现的折半查找算法,简单描述了折半查找的原理,并结合实例形式分析了php采用递归与非递归方式实现折半查找算法的相关操作技巧,需要的朋友可以参考下
  • 折半查找算法

    万次阅读 2021-01-15 11:21:30
    总结: 分析二分查找代码时,不要出现 else,全部展开成 else if 方便理解; 注意「搜索区间」和 while 的终止条件,如果存在漏掉的元素,记得在最后检查 如需要搜索左右边界,只要在 nums[mid] == target 时做修改...

    从一个题目入手

      比如我买了一双鞋,你好奇问我多少钱,我说不超过300元。你还是好奇,我就让你猜,你会怎么猜?
      答案:猜中间数

    代码实现:

        在这里插入图片描述

    二分查找应用:

     寻找一个数、寻找左侧边界、寻找右侧边界

    1)代码框架:

     二分查找法实质上是不断地将有序数据集进行对半分割,并检查每个分区的中间元素。时间复杂度为O(log2(n))
    在这里插入图片描述

    2)寻找一个数:

    在这里插入图片描述

    int binarySearch(int nums[],int number,int target){
        int left = 0;
        int right = number - 1; //right是数组最大索引 这里是8
        while(left <= right){
            int mid = (right + left) / 2;
            if(nums[mid] == target){
                return mid;
            } else if(nums[mid] < target){
                left = mid + 1;
            } else if(nums[mid] > target){
                right = mid - 1;
            }
        }
        return -1;
    }
    
    • while循环的条件应该是<=

    (以上例)初始化的搜索区间是[0,8],如果用<,会漏掉left等于right的情况

    • left = mid + 1right = mid - 1

    如果中间值小于目标值,那么目标值在中间值的右侧;如果中间值大于目标值,那么目标值在中间值的左侧。两种情况都不能包括边界,因为边界值已经判断过了。

     如果说有一有序数组 nums = [1,2,2,2,2,9]target = 2,此时想得到target 的左侧边界,即索引 1,或者想得到 target 的右侧边界,即索引5,就需要进行二分查找的两种扩展形式.

    3)寻找左侧边界:

    在这里插入图片描述

    int binarySearch(int nums[],int number,int target){
        int left = 0;
        int right = number;
    
        while(left < right){
            int mid = (right + left) / 2;
            if(nums[mid] == target){
                right = mid;
            } else if(nums[mid] < target){
                left = mid + 1;
            } else if(nums[mid] > target){
                right = mid;
            }
        }
        if(left == number)//如果目标值比所有数都大
        	return -1;
        return nums[left] == target ? left : -1; //判断逼近到索引值为零还未找到的情况
    }
    
    • while循环的条件应该是<

    (以上例)初始化的搜索区间是[0,6),如果用<=,很明显可能存在越界情况

    • left = mid + 1right = mid

    寻找左侧边界可以将过程理解为一个不断向左侧逼近的情况,当nums[mid]小于目标值时,开始向右侧逼近left = mid + 1(这里加1还是因为nums[mid]已经判断过了),然后left等于right,跳出循环.

    4)寻找右侧边界:

    在这里插入图片描述

    int binarySearch(int nums[],int number,int target){
        int left = 0;
        int right = number;
    
        while(left < right){
            int mid = (right + left) / 2;
            if(nums[mid] == target){
                left = mid + 1;
            } else if(nums[mid] < target){
                left = mid + 1;
            } else if(nums[mid] > target){
                right = mid;
            }
        }
    if (left == 0) //如果目标值比所有数都小
    	return -1;
    return nums[left - 1] == target ? (left - 1) : -1; //判断逼近到索引值最大还未找到的情况
    }
    

    寻找右侧边界可将过程理解为一个不断向右侧逼近的情况,当nums[mid]小于目标值时,开始向左侧逼近right = mid (这里不加1),然后left等于right,跳出循环.

    总结:

    1. 分析二分查找代码时,不要出现 else,全部展开成 else if 方便理解;

    2. 注意「搜索区间」和 while 的终止条件,如果存在漏掉的元素,记得在最后检查

    3. 如需要搜索左右边界,只要在 nums[mid] == target 时做修改即可。搜索右侧时返回值需要减一

    展开全文
  • 折半查找的手工过程: 1.我需要查找的数是10; 给定:1 5 8 10 13 14 17 22 25 27 29 31 35 37 40 42 45 47 50 51 58 下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19...

    折半查找的手工过程:

    1.我需要查找的数是10;

    给定:1  5  8  10  13 14  17  22  25  27  29  31  35  37  40  42  45  47  50  51  58

    下标:0  1  2   3   4    5    6    7     8    9   10  11  12  13  14  15  16  17  18  19  20

       h               m                  t

       h    m          t

       h m  t

         h   t

         m  h

           m

    这个手工过程到head = tail 时找到了。

    我需要查找的数是29;

    给定:1  5  8  10  13 14  17  22  25  27  29  31  35  37  40  42  45  47  50  51  58

    下标:0  1  2   3   4    5    6    7     8    9   10  11  12  13  14  15  16  17  18  19  20

       h               m                  t

    这个手工过程数在head < tail时程序停止,找到的是下标的那个数。

    代码如下:

    #include<stdio.h>
    #include<stdlib.h>
    int binarySearch(int *arr,int count ,int data){
        int middle;
        int head = 0;
        int tail;
        tail =  count;
        while(arr[middle] != data){
            middle = (head + tail)/ 2;
            
            if(arr[middle] < data){
                head = middle + 1;
            }else if(arr[middle] > data){
                tail = middle - 1;
            }
        }    
        return middle;
        return -1;
    }
    int main(){
        int n = 0;
        int m ;
        int a[10]={1,4,8,9,16,17,19,20,25,27};
        printf("请输入需要查找的数: ");
        scanf("%d",&n);
        m = binarySearch(a,10,n);
        printf("%d ",m);
        return 0;
    }
     

    这是一个简单的折半处理,用的是一个简单的数组

    需要强调的是:

          如果要运用折半算法,数必须是有序的(升序或者降序)

          很多人都认为while(head > tail)这样也是正确的,但是对于middle = data时条件一直成立就会出现问题的!

    转载于:https://www.cnblogs.com/youdiaodaxue16/p/9016337.html

    展开全文
  • 折半查找算法.ppt

    2019-08-19 09:58:35
    本书是折半查找算法的标准教材,目的是让大家知道好的程序设计和算法分析技巧,难得一见的好书!
  • java折半查找算法

    2021-04-17 02:47:29
    high 时表示查找区间为空,查找失败 } Java 代码: /** * 二分查找算法 * * @param srcArray 有序数组 * @param target 被查找的元素 * @retur......6 、不断利用循环和折半查找算法查找一个整数 n 是否在一个无序的 ...

    //当 low>high 时表示查找区间为空,查找失败 } Java 代码: /** * 二分查找算法 * * @param srcArray 有序数组 * @param target 被查找的元素 * @retur......

    6 、不断利用循环和折半查找算法查找一个整数 n 是否在一个无序的 int 型数...

    查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,文中介绍四种查找算法,分别是顺序查找、二分查找、二叉排序树查找和哈希查找。...

    . 6.编写基于Java语言的折半查找算法。 /*** * 功能:该算法实现折半...

    . 6.编写基于Java语言的折半查找算法。 /*** * 功能:该算法实现折半...

    3)利用排序算法将一数组按由小到大排列,输入一个数据,查找在数组中是否存在,采用“折半查 找”加快查找速度。 所谓“折半查找”就是先与中间位置元素进行比较,......

    第八章查找补充作业解答(Java版)_理学_高等教育_教育专区。O(∩_∩)O~ 第八章查找 作业解答 作业解答 1.画出对长度为 10 的有序表进行折半查找的判定树,......

    3)利用排序算法将一数组按由小到大排列,输入一个数据,查找在数组中是否存在,采用“折半查 找”加快查找速度。 所谓“折半查找”就是先与中间位置元素进行比较,......

    Java程序设计大学教程 第五章 算法与数据结构程序是建立在数据结构基础上使用计算机 语言描述的算法,因此简单地讲,程序也 可以表示成:算法+数据结构。 本章介绍算法......

    六、 实验体会 本次试验解决了二分查找和三分查找的问题,加深了对分治法的 2015-2016 学年 第一学期 算法设计与分析实验报告 理解,收获很大,同时我也理解到......

    上传第9章查找习题,二分法查找例题,写出二分查找算法vb,数据结构查找习题,二分法查找c语言,查找习题,数据结构(查找习题),java二分法查找算法,数据结构查找的习题,二分......

    (2)题意 将顺序、折半查找算法设计成线程,启动二个不同 线程同时运行,并计算不...

    public static int binarySearch(int[] table, int value) //折半查找算法,数组元素已按升序排列 { //若查找成功返回元素下标,否则返回-1 if (table!=null)......

    共 5 if(adj.edges[i][k]==1 && visited[k]==0) { visited[k]=1; connected(adj,k,j,c); } else k++; } } 8.写出实现折半查找的算法或程序......

    //当 low>high 时表示查找区间为空,查找失败 } Java 代码: /** * 二分查找算法 * * @param srcArray 有序数组 * @param target 被查找的元素 * @retur......

    2、有序表的查找问题描述折半查找也称为二分查找,作为二分查找对象的数据必须是顺序...

    ("哈希表开放地址法的查找")) { ... } //退出 if (command.equals("退出")) System.exit(0); } 四、算法设计 我负责的是按钮动作的实现。 1、流程图......

    public static int binarySearch(int[] table, int value) { //折半查找算法,数组元素已按升序排列 //若查找成功返回元素下标,否则返回-1 if (table!=null)......

    ? 熟悉数组的排序、查找等算法。 ? 掌握字符数组的使用方法。 实验内容: 1) 编写数组的排序程序。 2) 编写折半查找的程序。 3) 编程实现:产生一个 1-12 ......

    8.查找 ① 理解查找的基本概念和查找算法效率的分析方法。 ② 掌握线性表的顺序查找、有序顺序表的折半查找、索引顺序表的分块查找算法。 ③ 理解散列表的概念,......

    展开全文
  • 主要介绍了PHP折半(二分)查找算法,结合实例形式较为详细的分析了php折半(二分)查找算法的概念、原理、实现与使用方法,并附带了一个php折半(二分)查找算法类供大家参考,需要的朋友可以参考下
  • 主要介绍了Java数据结构实现折半查找算法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 折半查找算法介绍折半查找(Binary Search)又称为二分查找。它的前提是线性表中的记录必须是关键码有序(通常从小到大有序),线性表必须采用顺序存储。从算法名称可以看出算法的思路,先取有序序列中间值与查找值...
  • 折半查找算法的算法复杂度

    千次阅读 2021-07-10 10:43:29
    n个元素。k次查找。 每次查找之后剩余的元素个数分别是:n、n/2、n/4、.... 、n/(2^k) n/(2^k)>=1 令n/(2^k)=1,则时间复杂度是O(log2n),以2为底n的对数。
  • // 折半查找 public static void main(String[] args) { int[] arr = {2,6,3,1,8,9,10}; int index = binarySearch(arr,8); System.out.print(index);//输出 4 } /** * * @param arr 要进行查找的数组...
  • 1.折半查找可以采用非递归算法,也可以采用递归算法。下面就用代码分别实现两种算法: //非递归算法实现 #define maxSzize 10000; typedef struct seqList { int data[maxSzize]; int length; }; int midSearch...
  • 主要介绍了基于JavaScript实现的折半查找算法,结合实例形式分析了折半查找的原理、操作步骤及javascript实现折半查找的相关操作技巧与注意事项,需要的朋友可以参考下
  • 折半查找是我很喜欢的一种查找方式,它代码简单,查询效率很高,时间复杂度是0(log2n). 折半查找是在一个有序的元组中查找元素,它通过关键词与中间值的比较,来查找相关的元素。如果关键词比中间值大,那么就在元组...
  • 对比分析折半查找与Fibonacci查找算法。 ①二分查找算法 算法思想: 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较 如果两者相等,则查找成功; 否则利用中间位置记录将表分成前、后...
  • 算法是在折半算法的基础上,推广折段的段数,通过简单的数学模型证明了最优的分段数为3,而不是2(即折半)。在文章的最后给出了算法的C程序代码。如果有应用到实际中,算法还可以进一步精简。
  • 主要介绍了C++二分查找(折半查找)算法,结合实例形式详细分析了二分查找算法的原理、思想、实现方法与相关操作技巧,需要的朋友可以参考下
  • 这时候,我们就需要用到折半(二分)查找算法啦。 一、思路 那什么是折半(二分)查找算法呢? 我们先来看一个情景—猜数字游戏,数字的范围在1-100之间,我让你猜某个数字,那么聪明的你第一时间肯定会猜50,然后...
  • 折半查找概念折半查找,又称二分查找。前提是线性表中的记录必须是关键码有序(由小到大或由大到小),线性表必须采用顺序存储。折半查找的基本思想是:在有序表中,取中间值为比较对象,如果给定的值和中间值的关键字...
  • 一、前言 上一篇博客讲了有关于查找的概念及顺序查找算法,这次我们再讲解一种新...上次我们说适合静态查找的有顺序查找和折半查找等,今天就给大家讲述一下折半查找。 细心的小伙伴们发现了,我在讲顺序查找的博...
  • 减治法在查找算法中的应用 折半查找:(时间复杂度O(log以2为底n的对数)) 对于有序数组的查找来说,折半查找是一种非常高效的算法,其基本原理为:比较查找键k和数组中间元素a[m],如果相等,算法结束;如果k<a...
  • 查找算法折半查找

    千次阅读 2021-01-05 14:48:30
    折半查找算法的思路 首先查找的关键字在有序的查找表内, 这是折半查找的前提.(我们假设查找表内元素升序排列) 确定查找表中的范围,一般用两个下标来表示范围: left = 0,right = length -1 利用给定的关键字和查找...
  • 折半查找算法及程序实现 一教材分析 教学重点以图示法方式演示折半查找算法的基本思想 教学难点由折半查找算法的思想到程序代码编写的转换尤其是其中关 键性语句的编写是教学中的难点 二学情分析 学生应该已经掌握...
  • 折半查找 代码 #include<stdio.h> #include<malloc.h> typedef struct{ int *elem; int length; }sstable; int searchbin(sstable ST,int key) { int low,high,mid; low=1;high=ST.length; while(low) { mid=(low+hi
  • 一、折半查找 (一)算法思想 折半查找,又称“二分查找”,仅适用于有序的顺序表 2. 折半查找判定树的构造如果当前low和high之间有奇数个元素,则 mid 分隔后,左右两部分元素个数相等如果当前low和high之间有偶数...
  • 算法 冒泡排序:排序过程中每次从剩下的元素中选出最大值元素放到数组的最后,每次排序通过数组中两两比较,依次比较挑选直到倒数两个数比较完后将数组中最大值放入数组的最后一个元素中。 如:{5,4,7,2,9,6} 第一趟...
  • 本文主要介绍了PHP实现的折半查找算法,简单描述了折半查找的原理,并结合实例形式分析了php采用递归与非递归方式实现折半查找算法的相关操作技巧,需要的朋友可以参考下,希望能帮助到大家。定义:折半查找技术,也...
  • 这篇文章主要介绍了PHP实现的折半查找算法,简单描述了折半查找的原理,并结合实例形式分析了php采用递归与非递归方式实现折半查找算法的相关操作技巧,需要的朋友可以参考下本文实例讲述了PHP实现的折半查找算法。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,603
精华内容 5,041
关键字:

折半查找算法分析