精华内容
下载资源
问答
  • 折半查找C++)
    2021-04-18 00:02:34

    折半查找

    必须采用顺序存储结构,而且表中元素按关键字有序排列

    原理

    与中值比较,不断缩小区间范围

    代码

    #include

    using namespace std;

    int BinarySearch(int a[], int low, int high, int target)
    {
    while(low <= high)
    {
    int mid = low + (high - low); //即(low + high)/2,这样写是防止溢出
    if(a[mid] > target) //若目标元素小于中值,锁定在左半部分
    high = mid - 1;
    else if(a[mid] < target) //若目标元素大于中值,锁定在右半部分
    low = mid + 1;
    else
    return mid; //找到目标值,返回目标值下标
    }
    return -1; //若数组中未含目标值,返回-1
    }
    int main()
    {
    int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int len = 9; //定义数组长度
    int target = 3; //待寻找的元素位置
    int low = 0; //第一个元素下标
    int high = len - 1; //最后一个元素下标

    cout << BinarySearch(a, 0, 8, 3) << endl;
    
    return 0;
    

    }

    更多相关内容
  • 2.有15个数存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。以15个数用赋初值的方法在程序中给出。要找的数用scanf函数输入。
  • 选择排序法+循环折半查找法 代码如下:#include<iostream>using namespace std;int main(){ int a[15]; int n,i; void array_sort(int a[], int n); int zeban(int a[], int start ,int end,int n); cout<<...
  • C/C++实现折半查找法(二分法)

    千次阅读 2021-01-19 11:59:40
    大家都知道许多排序方法和对应的查找方法,今天我就来介绍一超级高效的查找方法:折半查找法(也叫二分法)。但是首先说明,这种方法只是用于顺序排列的数组(重点哈)。 折半查找法 #define _CRT_SECURE_NO_...

    大家都知道有许多排序方法和对应的查找方法,今天我就来介绍一个超级高效的查找方法:折半查找法(也叫二分法)。但是首先说明,这种方法只是用于顺序排列的数组(重点哈)。

    折半查找法

    #define _CRT_SECURE_NO_WARNINGS 1
    #include <stdio.h>
    
    int main()
    {
    	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    	int sz = sizeof(arr) / sizeof(arr[0]);   //求出数组中元素的个数
    
    	int right = sz - 1;                      //设定一个数组右下标
    	int left = 0;                            //设定一个数组的左下标
    
    	printf("请输入你要查询的数字:>");
    	int input;
    	scanf("%d", &input);
    
    	while (left <= right)                    //只有在左下标 <= 右下标的时候才执行
    	{
    		int mid = (left + right) / 2;        //这是折半查找法的核心,和定义一个中间数,将你要找的数和中间数相比较,然后进一步缩小范围
    		if (input < arr[mid])                   
    		{
    			right = mid - 1;                 //如果要找的数 < 中间数,则说明要找的数在刚刚划分区间的左边
    		}
    		else if (input > arr[mid])          
    		{
    			left = mid + 1;                  //如果要找的数 > 中间数,则说明要找的数在刚刚划分区间的右边
    		}
    		else if(arr[mid] == input)           //经过不断的缩小区间,最终找到该数字
    		{
    			printf("找到了,%d的下标为:> %d ", input, mid);
    			break;
    		}
    	}
    	if (left > right)
    	{
    		printf("没找到 %d 这个数字。", input);
    	}
    	return 0;
    }
    }
    

    在这里插入图片描述

    同理C++

    C++版本(用函数实现)

    #define _CRT_SECURE_NO_WARNINGS 1
    #include <iostream>
    using namespace std;
    
    typedef int Type;
    int binary_search(int arr[], int len, Type input)
    {
    	int left = 0;
    	int right = len - 1;
    
    	while (left <= right)
    	{
    		int mid = left + (right - left) / 2;
    		//int mid = (left + right) / 2;  //避免int数据溢出
    		if (input > arr[mid])
    		{
    			left = mid + 1;
    		}
    		else if (input < arr[mid])
    		{
    			right = mid - 1;
    		}
    		else
    		{
    			return mid;
    		}
    	}
    
    	if (left > right)
    		return 0;
    }
    
    int main()
    {
    
    	int arr[] = { 1,3,5,7,9,10,12,15,17 };
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	cout << "请输入你要查找的数字:> " ;
    	Type input;
    	cin >> input;
    	int judge = binary_search(arr, sz,input);
    
    	if (judge)
    	{
    		cout << "找到" << input << "了" << "该下标为:> " << judge << endl;
    	}
    	else
    	{
    		cout << "未找到该数字" << endl;
    	}
    
    	return 0;
    }
    
    

    如果你在 2^32次方个数中找数,只需要32次就能找到,真是腻害。

    最后强调虽然只能查找有序数组哦

    展开全文
  • 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。以下是此题的【c源代码】,需要【c++源代码】请点击进入#include #...

    有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。

    以下是此题的【c源代码】,需要【c++源代码】请点击进入

    #include

    #define  N 15

    int main()

    { int i,number,top,bott,mid,loca,a[N],flag=1,sign;

    char c;

    printf("enter data:\n");

    scanf("%d",&a[0]);

    i=1;

    while(i

    {scanf("%d",&a[i]);

    if (a[i]>=a[i-1])

    i++;

    else

    printf("enter this data again:\n");

    }

    printf("\n");

    for (i=0;i

    printf("%5d",a[i]);

    printf("\n");

    while(flag)

    {printf("input number to look for:");

    scanf("%d",&number);

    sign=0;

    top=0;            //top是查找区间的起始位置

    bott=N-1;         //bott是查找区间的最末位置

    if ((numbera[N-1]))  //要查的数不在查找区间内

    loca=-1;        // 表示找不到

    while ((!sign) && (top<=bott))

    {mid=(bott+top)/2;

    if (number==a[mid])

    {loca=mid;

    printf("Has found %d, its position is %d\n",number,loca+1);

    sign=1;

    }

    else if (number

    bott=mid-1;

    else

    top=mid+1;

    }

    if(!sign||loca==-1)

    printf("cannot find %d.\n",number);;

    printf("continu or not(Y/N)?");

    scanf(" %c",&c);

    if (c=='N'||c=='n')

    flag=0;

    }

    return 0;

    }‍

    展开全文
  • C++算法——折半查找

    千次阅读 2021-04-15 17:02:50
    但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列 步骤 以下用数组1,2,3,4,5,6,7,8,9为例 此时我们查找3 1.首先我们的查找范围是全部,取两头下标的平均值 首先两头下标是0和n-1 ...

    简介

    英文名:Binary Search
    也称二分查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列

    步骤

    以下用数组1,2,3,4,5,6,7,8,9为例
    此时我们查找3

    1.首先我们的查找范围是全部,取两头下标的平均值
    • 首先两头下标是0和n-1
      在这里插入图片描述
    • 此时得到中间值5
    2.将两个数进行比较,然后缩小查找范围
    • 经过比较,得到的中间值大于要查找的数,所以我们要找的数应该位于中间值的左侧,所以范围改为原本的左侧到中间值前一个数
      在这里插入图片描述
    3.重复第1,2步直到找到数或者找不到
    • 我们接着上面的步骤
      在这里插入图片描述- 此时查找数更大,所以这次我们缩小到右侧
      在这里插入图片描述在这里插入图片描述

    • 此时我们就找到了,可以返回下标了

    • 接下来我们看找不到,我们将数组中的3去掉,然后再来一次查找

    • 在这里插入图片描述在这里插入图片描述
      在这里插入图片描述

    • 此时两边合并到了一个数,仍然不是,所以可以判定没有这个数,要注意两侧下标仍会变化,再返回-1
      在这里插入图片描述

    代码

    • 从上面过程可得我们需要两个变量来标记左侧和右侧,所以我们创建low 和high

    在这里插入图片描述

    • 然后每次计算的中间值,我们用mid来表示
      在这里插入图片描述
    • 然后根据比较结果我们来改变low和high的值(每次改变一个)
      在这里插入图片描述在这里插入图片描述
    • 如上面,最终low与high会合并(注意合并时也要比较),此时我们比较后发现也不是,按照规律,此时high会到low前面,这时才可以确定没有,所以这个循环的条件就是low<=high
    #include<bits/stdc++.h>
    
    using namespace std;
    
    int BinarySearch(int a[],int low,int high,int target)
    {
        while(low<=high)
            {
                int mid=low+(high-low)/2;//溢出问题
                cout<<"low:"<<low<<" high:"<<high<<" mid:"<<mid<<endl;
                if(a[mid]>target)
                    high=mid-1;
                else if(a[mid]<target)
                    low=mid+1;
                else
                    return mid;
    
            }
        return -1;
    }
    
    
    int main()
    {
        int a[10]={1,2,3,4,5,6,7,8,9};
        int len=9;
        cout<<BinarySearch(a,0,len-1,3)<<endl;
        return 0;
    }
    
    
    
    
    
    
    
    
    
    
    

    特性

    时间复杂度

    时间复杂度可以表示 O ( l o g 2 n ) O(log2n) O(log2n)

    小测验

    这次不用改代码了,直接来个题

    一个长度为n-1的递增数组中所有的数字都是唯一的,并且每个数字都在范围0~n-1之内,在范围内的n个数字中有且只有一个数字不在该数组中,请找出这个数字

    输入数据是n和数组

    输入:9 0 1 2 4 5 6 7 8
    输出:3

    输入:6 0 1 2 3 4
    输出:5

    输入:4 1 2 3
    输出:0

    这个题有很多种方法,但这里考验用二分来解题

    新花样整活来了(Θ▽Θ)
    顺带一提有兴趣可以再学学三分法

    展开全文
  • C++折半查找的实现

    千次阅读 2020-09-05 17:18:40
    注意:(咳咳,敲黑板)折半查找法仅适用于对已顺序的数组、数据进行操作!!! 很显然,折半查找法相对于其他查找方法例如顺序查找法效率要高很多; 下面我们来实际操作一下,了解二分查找的奥义。 例如:要在...
  • 折半查找算法

    2014-09-26 13:01:43
    折半查找算法,c、c++,数据结构课本中讲解的算法实现。
  • C++实例:折半法查找

    2020-07-15 08:27:36
    随机产生一1~1000之间的整数,使用折半查找法找到该,并且同时显示折半查找的次数。 #include<iostream> #include<cstring> #include<ctime> #include<cstdlib> #include<conio.h&...
  • 折半查找(C++实现)

    千次阅读 2020-09-07 17:28:14
    折半查找 定义: 计算机科学中,折半搜索(英语:half-interval search),也称二分搜索(英语:binary search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。 搜索过程...
  • 输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,输出“不在表中”。,解: 从表列中查一个数最简单的方法是从第1个数开始顺序查找,将要找的数与表列中的数一一比较,直到找到...
  • 描述 请编写一递归的折半查找算法,查找给定有序数组中的某一元素。 输入 多组数据,每组数据三行。...这题就是折半查找的最基本应用了,折半查找会了这题就没难度了,能想到的优化方法就是用ve.
  • 有15个数按小由到大顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数在数组中的下标。 相关知识 顺序查找法,不要求被查找的数组元素事先是有序排列的;折半查找要求被查数组是有序的。 若初始查找...
  • 折半查找要求线性表有序的 下面的这种查找算法采用递归实现,并没有利用折半查找有序的特性,所有下面的这种算法适用于其他特殊线性表; #include <iostream> using namespace std; //递归实现的查找算法 int...
  • 有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。以下是此题的【c++源代码】,需要【c源代码】请点击进入#include ...
  • 原理闲荡简单就是我们正常思维的查找,从给定的序列出发,依次检查序列中的每一项目是否为我们给定的关键字。是则查找成功,否则查找失败。 bool searchByOrder(vecter&lt;int&gt; vec){ for(int i = 0; ...
  • c++折半查找算法

    千次阅读 2018-10-24 11:20:38
    何谓折半查找,举个例子很快就可以明白,给你了9个数 1 2 3 4 5 6 7 8 9 让你去找2在哪里,这时候你肯定会说这太简单了,但是计算机就没那么强了,它得拿着2和这9个数一个一个的比较,2在前面还好比较的次数比较小,...
  • #include #include #include using namespace std; class Find { private: int n; public: ... cout用折半法找的次数为"; break; } } } }; int main() { Find f; f.find(); return 0; }
  • C语言实现 用折半查找法寻找数组中的
  • 折半查找c++

    2021-12-08 21:03:14
    //顺序查找表的定义 typedef int ElemType; typedef struct { ElemType *elem; //数据元素存储空间基址,0 号单元留空 int length; //表长度 }SSTable; //创建查找表 void CreateTable(SSTable &ST) { //根.
  • 折半查找法是数据结构与算法的应用中相对重要的一查找方法。还可以通过数学方法计算其时间复杂度。
  • C++数据结构折半查找法二分查找法,算法设计新颖,有利于数据结构初学者的学习!
  • 本文实例讲述了C++二分查找(折半查找)算法。分享给大家供大家参考,具体如下: 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。 因此,折半查找...
  • 本文实例为大家分享了C语言实现顺序表的顺序查找和折半查找的具体代码,供大家参考,具体内容如下 顺序查找: #include using namespace std; int SeqSearch(int r[],int n,int k) { r[0]=k;//下标0用作哨兵存放...
  • 折半查找法.cpp

    2019-06-15 17:09:03
    本资源是用C语言所写的数据结构中折半查找法,代码比较简单,基础好的就不必下载了,浪费积分。
  • #include<iostream> using namespace std; int main() { int a[15]={15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};//这题是从大到小!!!!!!! int l=0,h=14,x,m;..."输入查找:"; cin>>x; ...
  • #include <iostream> using namespace std; int main() { int a[15]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,145}; cout<<"请输入要查找的";...//中间的折半查找 while(l<m) { ...
  • 折半查找法的使用

    2021-09-30 17:28:03
    【问题描述】给定一按值有序(升序)的N元整数组A,采用折半查找法查找关键值k的位置,并给出查找的过程 【输入形式】 第一行:N 第二行:A[0], A[1], ... , A[N-1] 第三行:k 【输出形式】 第一行:k的位置...
  • 折半查找法 谭浩强习题

    千次阅读 2018-11-14 21:56:54
    #include&lt;stdio.h&gt;...请按从大到小输入15个数:"); for (int i = 0; i &lt; 15; i++) scanf_s("%d", &amp;a[i]); int low, high, mid; for (lo...
  • 顺序查找和折半查找

    2017-12-07 20:43:40
    用顺序存储结构表示查找表,实现以下运算要求: (1)建立一整数数据文件 datafile; (2)从文件 datafile 读取数据,并导入一维... (4)先对数组中的元素进行排序,分别用递归和非递归两种方式实现折半查找方法。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,438
精华内容 1,375
关键字:

有15个数折半查找法c++

c++ 订阅
友情链接: 3V.rar