学习心得:二分查找

这篇具有很好参考价值的文章主要介绍了学习心得:二分查找。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

二分查找

基础:查找元素是否出现

#include <stdio.h>
int main() {
    int a[10]={0,1,1,3,4,5,6,7,8,9},int x;
    scanf("%d",&x);
    int l=0,r=9,count=0;
    while(l<=r){
        int m=(l+r)/2;
        if(a[m]==x){
            count=m;
            break;
        }
        if(a[m]>x){
            r=m-1;
        }
        if(a[m]<x)
            l=m+1;
    }
    printf("%d",count);
    return 0;
}

高级:查找元素出现次数

当你需要找到目标元素的第一个和最后一个出现位置时,你可以通过稍作修改来实现。以下是一个引导你思路的步骤:

  1. 找到第一个出现位置:
    • 使用标准的二分查找算法找到目标元素。
    • 如果找到目标元素,检查它的前一个元素是否也是目标元素,如果是,则继续在左侧搜索,否则,当前位置就是第一个出现位置。
  2. 找到最后一个出现位置:
    • 同样使用标准的二分查找算法找到目标元素。
    • 如果找到目标元素,检查它的后一个元素是否也是目标元素,如果是,则继续在右侧搜索,否则,当前位置就是最后一个出现位置。
  3. 处理未找到的情况:
    • 如果在第一步找到第一个出现位置时未找到目标元素,或者在第二步找到最后一个出现位置时未找到目标元素,表示目标元素不存在。
#include<stdio.h>
#include<stdlib.h>
void swap(int *m,int *n){
    int temp=*m;
    *m=*n;
    *n=temp;
}
void sort(int n,int a[n],int l,int r){
    if(l<r) return;
    int key=a[0],ll=l,rr=r;
    while(ll!=rr){
        while(key<=a[rr]&&ll<rr) rr--;
        while(key>=a[ll]&&ll<rr) ll++;
        swap(&a[ll],&a[rr]);
    }
    swap(&a[l],&a[ll]);
    sort(n,a,l,ll-1);
    sort(n,a,ll+1,r);
}
int search(int n,int a[n],int key){
    int l=0,r=n-1;
    while(l<=r){
        int m=(l+r)/2;
        if(a[m]==key){
            int rec1=m,rec2=m;
            while(rec1!=0&&a[rec1-1]==key){
                rec1--;
            }
            while(rec2!=n-1&&a[rec2+1]==key){
                rec2++;
            }
            return rec2-rec1+1;
        }
        if(a[m]<key){
            l=m+1;
        }
        if(a[m]>key) {
            r=m-1;
        }
    }
    return -1;
}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    int *a=(int *)calloc(n,sizeof(int));
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    int l=0,r=n-1;
    sort(n,a,l,r);
    while(m--){
        int x;
        scanf("%d",&x);
        int count=search(n,a,x);
        if(count==-1){
            printf("0");
        }else{
            printf("%d\n",count);
        }
    }
    free(a);
    return 0;
}

bsearch函数(<stdlib.h>)

bsearch常与qsort函数联合使用。bsearch查找成功返回指向该元素的指针。

4个参数:

key 指向要查找的元素

base 指向进行查找的数组

num 数组中元素的个数

size 数组中每个元素的大小,一般用*sizeof()*表示

cmp 比较两个元素的函数,定义比较规则。需要注意的是,查找数组必须是经过预先排序的,而排序的规则要和比较子函数cmp的规则相同。

  1. 整型
int cmp(const void *a, const void *b){
	return *(int *)a - *(int *)b;//升序
//	return *(int *)b - *(int *)a;//降序
}
  1. 浮点型

需要注意浮点数会存在精度损失的问题,所以我们需要通过比较,来返回1或-1,以确定是增序还是降序。文章来源地址https://www.toymoban.com/news/detail-805764.html

int cmp(const void *a, const void *b){
	return ((*(double *)a - *(double *)b)>0?1:-1);//升序
//	return ((*(double *)a - *(double *)b)<0?1:-1);//降序
}
  1. 字符型
int cmp(const void *a, const void *b){
	return *(char *)a - *(char *)b;//升序
//	return *(char *)b - *(char *)a;//降序
}
  1. 字符串型
   int cmp(const void *a, const void *b){
   	return strcmp((char *)a, (char *)b);//升序
   //	return strcmp((char *)b, (char *)a);//降序
   }
  1. 字符串指针数组
int cmp(const void *a, const void *b){
	return strcmp(*(char **)a, *(char **)b);//升序
//	return strcmp(*(char **)b, *(char **)a);//降序
}
  1. 结构体
//sample 1
struct node{
	int id;
}s[100]; 
int cmp(const void *a, const void *b){
	struct node *aa = (node *)a;
	struct node *bb = (node *)b;
	return ((aa->id)>(bb->id))?1:-1;//升序
//	return ((aa->id)>(bb->id))?-1:1;//降序
}
//sample 2
struct node{
	int id;
	char data;
}s[100]; 

int cmp(const void *a, const void *b){
	struct node *aa = (node *)a;
	struct node *bb = (node *)b;
	if(aa->id == bb->id)//若id相同,按照data排序 
		return aa->data - bb->data;
	else//否则按照id排序 
		return aa->id - bb->id;//升序
}

到了这里,关于学习心得:二分查找的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2023年03月青少年软件编程C语言二级真题答案——持续更新.....

    请编写一个程序实现以下功能:从一个字符串中,提取出所有的数字字符即0-9,并作为数求和。 时间限制:1000 内存限制:65536 输入 一行字符串,长度不超过100,字符串中不含空格。 输出 字符串中所有数字字符作为数的和 样例输入 Lsd2f02k3ja3sdf223 样例输出 17

    2023年04月13日
    浏览(81)
  • 青少年软件编程C++一级真题(202212)

    1、输入一个整数x,输出这个整数加1后的值,即x+1的值。 时间限制:1000 内存限制:65536 输入 一个整数x(0 ≤ x ≤ 1000)。 输出 按题目要求输出一个整数。 样例输入 样例输出 2、给定整数a、b、c,计算(a / b)*c的值,这里的除法为实数除法。 时间限制:1000 内存限制:65536 输

    2024年02月09日
    浏览(48)
  • 2022.12 青少年软件编程(Python) 等级考试试卷(一级)

    2022年12月 青少年软件编程(Python) 等级考试试卷(一级) 分数: 100 题数: 37 一、 单选题(共 25 题, 共 50 分) 1. 关于Python语言的注释,以下选项中描述错误的是?( ) A.Python语言有两种注释方式:单行注释和多行注释 B.Python语言的单行注释以#开头 C.Python多行注释使用###来

    2024年02月11日
    浏览(55)
  • 蓝桥杯、编程考级、NOC、全国青少年信息素养大赛—scratch列表考点

    1.准备工作 (1)选择背景 Colorful City; (2)保留角色小猫,选择角色Ballerina。 2.功能实现 (1)角色小猫初始位置在舞台左下方,角色Ballerina初始位置在舞台右下方,如下图所示; (2)点击小猫,小猫询问\\\"请输入一段英文\\\",输入的英文只包含大写字母、空格和标点符号;

    2024年01月21日
    浏览(64)
  • 2023年5月青少年软件编程(Python) 等级考试试卷(四级)

    青少年软件编程(Python) 等级考试试卷(四级)2023.6 分数: 100 题数: 38 一、 单选题(共 25 题, 共 50 分) 1.下列程序段的运行结果是? ( ) def s(n): if n==0: return 1 else: return n +s(n-1) print(s(7)) A.29 B.27 C.1 D.0 试题类型: 单选题 标准答案: A 试题难度: 一般 试题解析: 递归公式

    2024年02月09日
    浏览(42)
  • 全国青少年信息素养大赛图形化编程决赛·模拟三卷,含答案解析

    目录 一、单选题 下载文章打印做题: 全国青少年电子信息智能创新大赛 图形化编程· 挑战 题模拟 三 卷 一、单选题 1. 运行如下图所示的程序,输入60后,变量“数值

    2023年04月24日
    浏览(51)
  • 2023年5月青少年软件编程(Python) 等级考试试卷(二级)

    青少年软件编程(Python) 等级考试试卷(二级) 一、 单选题(共 25 题, 共 50 分) 1.运行以下程序, 如果通过键盘先后输入的数是 1 和 3, 输出的结果是? ( ) a=int(input() ) b=int(input() ) if a b: a=b print(a) A.3 1 B.1 3 C.1 D.3 试题类型: 单选题 标准答案: D 试题难度: 一般 试题解

    2024年02月09日
    浏览(64)
  • 石头剪刀布--蓝桥杯大赛青少年创意编程C++高级组模拟题

    石头剪刀布 Description 放假期间,小蓝与电脑对垒,玩起了一款经典的游戏: “石头剪刀布” 。游戏规则想必大家已经非常熟悉了:两边一样则为平局,否则石头胜于剪刀;剪刀胜于布;布胜于石头。小蓝与电脑的对垒一共有 n 个回合,平局或败局得分为 0;胜局得分取决于

    2023年04月12日
    浏览(68)
  • 全国青少年软件编程等级考试Python标准解读(1_6级)

    考核性质: 全国青少年软件编程等级考试标准(Python语言)由中国电子学会科普培训与应用推广中心和北京大学信息科学技术学院共同制定。由全国青少年电子信息科普创新联盟标准工作组开发,由中国电子学会普及工作委员会审核通过,适用于由中国电子学会举办的全国青

    2024年02月05日
    浏览(99)
  • 2023年03月份青少年软件编程Python等级考试试卷三级真题(含答案)

    2023-03 Python三级真题 分数:100  题数:38 测试时长:60min 一、单选题(共25题,共50分) 1.十进制数111转换成二进制数是?( )(2分) A.111 B.1111011 C.101111 D.1101111 2.某班有36人,王老师想给每位同学分配一个二进制的学号,那么该学号至少需要多少位?( )(2分) A.36 B.5 C.6 D.

    2024年02月12日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包