C语言之两分法查找

合集下载

C语言 二分查找

C语言 二分查找

二分查找从键盘输入某数组数据,然后根据要求采用二分查找法查找输入的值.分析:因为二分查找法必须对有序序列进行操作,因此,在输入数组数据之后,应该首先进行排序工作,,然后采用二分查找相关的数据元素.源程序代码如下所示:/*文件名为ex5_6.cpp*/#include<iostream>Using namespace std;#define size 5int main(){//声明变量int ij;Float t,a[size];//从键盘上为数组赋值for(i=0;i<size;i++){cout<<"a["<<i<<"]=";Cin>>a[i];}//对数组接从小到大顺序排列for(i=0;i<size-1;i++)for(j=i+1;j<size;j++)if(a[i]>a[j]){t=a[i];a[i]=a[j];a[j]=t;}//显示排序结果for(i=0;i<size;i++)cout<<a[i]" ";cout<<end1;//输入要查找的数据int value;int found;int low,high,mid;for(i=1a;i<=3;i++){cout <<"value=";cin>>value;//二分法查找数组afound=0;low=0;high=size-1;while(low<=high){mid=(high+low)/2;if(a[mid]==value){found=1;break;}if(a[mid]<value)low=mid*1;elsehigh=mid-1;}if(found)cout<<"The value found at:a["<<mid<<"]="<<A[mid]<<end1;elsecout<<"The"<<value<<" is not found !"end1;}system('pause");return 0;}本例实现的关键在于两个方面:一个事对数组的排序;另一个是二分查找法的应用.在排序的过程中,本例采用了冒泡法的方式.因此,解决本例的问题关键爱你在于掌握冒泡法和二分查找的基本原理和实现过程即可.。

C语言的算法--------二分法查找

C语言的算法--------二分法查找

C语⾔的算法--------⼆分法查找int find(int n,int a[],int l){int low=0;int high=l-1;int middle=0;while(low<high){middle=(low+high)>>1;if(n==a[middle]){printf("%d,%d",n,middle);return 1;}else if(n>a[middle])low=middle+1;elsehigh=middle-1;}return 0;}int main(){int a[]={2,3,5,6,7,8,9,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60};int l=sizeof(a)/sizeof(a[0]);int i=0,n;printf("arry content");for(i=0;i<l;i++){if(i%8==0)printf("\n");printf("%4d",a[i]);}printf("\nseach n is ");scanf("%d",&n);if(!find(n,a,l))printf("not fond");return 0;}⼆分查找的基本思想是:(设R[low..high]是当前的查找区间)(1)⾸先确定该区间的中点位置:(2)然后将待查的K值与R[mid].key⽐较:若相等,则查找成功并返回此位置,否则须确定新的查找区间,继续⼆分查找,具体⽅法如下: ①若R[mid].key>K,则由表的有序性可知R[mid..n].keys均⼤于K,因此若表中存在关键字等于K的结点,则该结点必定是在位置mid左边的⼦表R[1..mid-1]中,故新的查找区间是左⼦表R[1..mid-1]。

数据结构C语言实现二分查找

数据结构C语言实现二分查找

实验课题:【用C描述课本的同学】有以下结构体构成的数组:struct StudentInfo{ char ID[10];char * name;float score;}StuInfo[12]={{"0800301105", "JACK", 95},{"0800201505", "LUN", 85},{"0400820115", "MARY", 75.5},{"0400850122", "KATE", 78.9},{"0500201011", "LILI", 88},{"0800401105", "JACK", 96},{"0600830105", "JAN", 98.4},{"0952520012", "SAM", 75},{"9721000045", "OSCAR", 64},{"0700301105", "JACK", 97},{"0458003312", "ZOE", 68.9},{"0400830211", "BOBI", 87.6}};对数组StuInfo按照学号(ID)递增排序,然后用二分查找的方法进行学号查找,若找到则输出该学生的全部信息,若找不到相应记录也给出提示;接下来,对该数组按照学分绩(score)递减排序后,使用二分查找法以学分绩作关键字进行查找。

用C++版教科书的同学:对MyBirds分别以name和ID为关键字排序,然后进行二分查找。

二分法查找元素公式(二)

二分法查找元素公式(二)

二分法查找元素公式(二)二分法查找元素公式1. 什么是二分法查找?二分法是一种基于比较的查找算法,也称为折半查找。

它是针对已排好序的数组进行查找的一种高效算法。

2. 二分法查找的原理二分法查找的原理是通过将要查找的范围分成两半,每次取中间位置的元素与目标值进行比较,根据比较的结果来确定下一次查找的范围,从而将查找范围逐渐缩小,直到找到目标值或者确定目标值不存在。

3. 二分法查找的公式二分法查找的公式如下:mid = (low + high) / 2其中,low表示当前查找范围的最小索引,high表示当前查找范围的最大索引,mid表示当前查找范围的中间索引。

4. 二分法查找的步骤二分法查找的步骤如下:•初始化low和high分别为数组的第一个索引和最后一个索引;•循环直到low大于high:–计算mid的值;–如果mid对应的元素等于目标值,则返回mid;–如果mid对应的元素小于目标值,则更新low为mid+1;–如果mid对应的元素大于目标值,则更新high为mid-1;•返回 -1,表示目标值不存在于数组中。

5. 举例说明假设有以下有序数组[1, 3, 5, 7, 9, 11, 13, 15, 17, 19],我们要查找数字9。

•初始时,low为0,high为9;•第一次循环,计算mid = (0 + 9) / 2 = 4,数组中索引为4的元素为9,找到目标值;•返回4。

通过二分法查找,我们可以快速定位到目标值9的位置。

6. 总结二分法查找是一种高效的查找算法,它的公式为mid = (low + high) / 2。

通过将查找范围逐渐缩小,可以快速找到目标值。

在处理大规模的有序数组查找时,二分法查找是一种常用的方法。

C语言二分查找算法,折半查找算法

C语言二分查找算法,折半查找算法

C语言二分查找算法,折半查找算法本实例采用二分查找法查找特定关键字的元素。

要求用户输入数组长度,也就是有序表的数据长度,并输入数组元素和査找的关键字。

程序输出查找成功与否,以及成功时关键字在数组中的位置。

例如,在有序表11、13、18、28、39、56、69、89、98、122 中査找关键字为89 的元素。

实现过程:(1) 自定义函数binary_search(),实现二分査找。

(2) main() 函数作为程序的入口函数。

程序代码如下:1.#include<stdio.h>2.int binary_search(int key,int a[],int n)//自定义函数binary_search()3.{4.int low,high,mid,count=0,count1=0;5. low=0;6. high=n-1;7.while(low<high)//査找范围不为0时执行循环体语句8.{9. count++;//count记录査找次数10. mid=(low+high)/2;//求中间位置11.if(key<a[mid])//key小于中间值时12. high=mid-1;//确定左子表范围13.else if(key>a[mid])//key 大于中间值时14. low=mid+1;//确定右子表范围15.else if(key==a[mid])//当key等于中间值时,证明查找成功16.{17.printf("查找成功!\n 查找 %d 次!a[%d]=%d",count,mid,key);//输出査找次数及所査找元素在数组中的位置18. count1++;//count1记录查找成功次数19.break;20.}21.}22.if(count1==0)//判断是否查找失敗23.printf("查找失敗!");//査找失敗输出no found24.return0;25.}26.27.int main()28.{29.int i,key,a[100],n;30.printf("请输入数组的长度:\n");31.scanf("%d",&n);//输入数组元素个数32.printf("请输入数组元素:\n");33.for(i=0;i<n;i++)34.scanf("%d",&a[i]);//输入有序数列到数组a中35.printf("请输入你想查找的元素:\n");36.scanf("%d",&key);//输入要^找的关键字37.binary_search(key,a,n);//调用自定义函数38.printf("\n");39.return0;40.}运行结果:。

C语言二分查找算法

C语言二分查找算法

C语言实现二分查找算法1.1/*二分算法*/#include<stdio.h>#define N 100int Found(int a[],int x,int y){int h,r,m;h=0;r=y-1;m=(h+r)/2;while(h<=r&&x!=a[m])if(x<a[m]) {r=m-1;m=(h+r)/2;}else {h=m+1;m=(h+r)/2;}if(h>r) return -1; /*查找失败,返回-1*/return m; /*查找成功,返回有效下标m */} // Search_Binvoid main(){int m,a[N],i,x,n;printf("请输入m=:\n");scanf("%d",&m);printf(" 请按从小到大的顺序输入一组数:\n");for(i=0;i<m;i++)scanf("%d",&a[i]);printf("请输入要查找的数:\n");scanf("%d",&x);n=Found(a,x,m);if(n==-1)printf("查找失败");elseprintf("\n位置是%d\n",n);}1.2#include <stdio.h>#include <stdlib.h>typedef int DATATYPE; /*假定顺序表元素的类型为整型*/#define maxsize 1024 /*假定顺序表的最大长度为1024*/typedef struct{DATATYPE data[maxsize]; /*顺序表元素数组,第一个结点是data[0] */ int len; /*线性表中实际存放的数据个数*/} SEQLIST;/******************************************************************** *********/void ListInit (SEQLIST *L)//将表L清空(初始化){L->len=0;}/******************************************************************** *********/int ListLength(SEQLIST L)//返回线性表L的元素个数{return(L.len);}int ListInsert(SEQLIST *L, int i, DATATYPE x)//在顺序表L的第i个位置插入元素x,成功:1,失败:0{int j;if ((L->len)>=maxsize){printf("overflow\n");return 0;} //溢出elseif((i<1)||(i>L->len+1)){printf("error\n");return 0;} //非法位置else{for(j=L->len-1;j>=i-1;j--)L->data[j+1]=L->data[j]; //结点后移L->data[i-1]=x; //插入xL->len=L->len+1; //表长加1return(1); //成功}}void Listinput(SEQLIST *L,DATATYPE x){int i,n;printf("请输入要输入的数据个数:");scanf("%d",&n);for(i=0;i<n;i++){printf("请输入第%d个数据:",i+1);scanf("%d",&(L->data[i]));L->len++;}printf("输入成功!!");}int Listsearch(SEQLIST *L,DATATYPE K){ int low=0,mid,high=L->len-1;while (low<=high){ mid=(low+high)/2; //整除if (K==L->data[mid])return mid;if (K<L->data[mid])high=mid-1;else low=mid+1;}return -1; //查找失败}main(){SEQLIST list;int i,xuanze,p;DATATYPE x;char flag='Y';ListInit (&list);while(1){printf(" 1、创建顺序表数组\n");printf(" 2、查找数据\n");printf(" 0、退出\n");printf("\n");printf("请选择:");scanf("%d",&xuanze);switch(xuanze){case 1:{Listinput(&list,x);break;}case 2:{while(toupper(flag)=='Y'){printf("\n请输入要查找的数据:");scanf("%d",&p);Listsearch(&list,p);if(Listsearch(&list,p)==-1)printf("查找失败!!\n");else printf("查找成功!!\n");printf("是否继续查找(y/n):");scanf("%s",&flag);}break;}case 0:{return ;break;}default:{printf("谢谢使用!!");break;}}system("cls");}}。

C语言丨二分查找算法详解(含示例代码)

C语言丨二分查找算法详解(含示例代码)

C语⾔⼁⼆分查找算法详解(含⽰例代码)⼆分査找也称折半査找,其优点是查找速度快,缺点是要求所要査找的数据必须是有序序列。

该算法的基本思想是将所要査找的序列的中间位置的数据与所要査找的元素进⾏⽐较,如果相等,则表⽰査找成功,否则将以该位置为基准将所要査找的序列分为左右两部分。

接下来根据所要査找序列的升降序规律及中间元素与所查找元素的⼤⼩关系,来选择所要査找元素可能存在的那部分序列,对其采⽤同样的⽅法进⾏査找,直⾄能够确定所要查找的元素是否存在,具体的使⽤⽅法可通过下⾯的代码具体了解。

#include <stdio.h>binarySearch(inta[], intn, intkey){intlow = 0;inthigh = n - 1;while(low<= high){intmid = (low + high)/2;intmidVal = a[mid];if(midVal<key)low = mid + 1;elseif(midVal>key)high = mid - 1;elsereturnmid;}return-1;}intmain(){inti, val, ret;inta[8]={-32, 12, 16, 24, 36, 45, 59, 98};for(i=0; i<8; i++)printf("%d\t", a[i]);printf("\n请输⼈所要查找的元素:");scanf("%d",&val);ret = binarySearch(a,8,val);if(-1 == ret)printf("查找失败 \n");elseprintf("查找成功 \n");return0;}运⾏结果:-32 12 16 24 36 45 59 98请输⼊所要查找的元素:12查找成功在上⾯的代码中,我们成功地通过⼆分査找算法实现了查找功能,其实现过程如下图所⽰。

用循环实现二分法查找过程(C语言)

用循环实现二分法查找过程(C语言)

/ቤተ መጻሕፍቲ ባይዱ是该加还是减
else if(arr[middle] < key ) low = middle + 1;
}
return (-1);
}
int middle = len/2;
while(high >= low)
{ middle = (high + low)/2;
if(arr[middle] == key) return middle;
else if(arr[middle] > key) high = middle - 1;
//前提是假设数组是从小到大排序,否则不确定
请您及时更换请请请您正在使用的模版将于2周后被下线请您及时更换
用循环实现二分法查找过程( C语言)
今天去实习面试,被问了一道二分法的程序,思路有,但是不知道怎么实现,想了老半天,还是没写完,请大家做个参考,说不定你也会被问到哦~
int binarysearch(int arr[],int len,int key) { int high,low; high = len - 1;//假设数组是从小到大排列的 low = 0;

二分查找法C语言立体7-6

二分查找法C语言立体7-6

二分查找法C语言立体7-6
二分查找法的算法步骤描述如下:设n个元素的数组a已升序排列,用left和right两个变量来表示查找的区间,即在a[left] 〜 a[right]区间去查找x。

初始状态为left = 0,right = n-1。

首先用要查找的x与查找区间的中间位置元素a[mid](mid = (left + right) / 2)比较,如果相等则找到;如果x < a[mid],由于数组是升序排列的,则只要在a[left] 〜 a[mid-1]区间继续查找;如果x > a[mid],则只要在a[mid+1] 〜 a[right]区间继续查找。

也就是根据与中间元素比较的情况产生了新的区间值left、right值,当出现left > right时,说明不存在值为x的元素。

输入格式:输入在第1行中给出一个正整数n(1≤n≤10)和一个整数x,第2行输入n个整数,其间以空格分隔。

题目保证数据不超过长整型整数的范围。

输出格式:在每一行中输出查找过程中对应步骤的中间结果,按照“[left,right][mid]”的格式输出。

提示:相邻数字、符号之间没有空格。

c语言查找算法

c语言查找算法

c语言查找算法
C语言是一种广泛使用的编程语言,它具有高效、简单、易学等特点,因此在各个领域都有广泛的应用。

在C语言中,查找算法是一种非常
重要的算法,它可以帮助我们在大量数据中快速查找到我们需要的数据。

下面我们将详细介绍C语言中的查找算法。

一、顺序查找算法
顺序查找算法是一种最简单的查找算法,它的基本思想是从数据的第
一个元素开始逐个比较,直到找到目标元素或者遍历完整个数据。


序查找算法的时间复杂度为O(n),其中n为数据的长度。

二、二分查找算法
二分查找算法也称为折半查找算法,它的基本思想是将数据分成两部分,然后判断目标元素在哪一部分中,再在该部分中继续进行查找,
直到找到目标元素或者确定目标元素不存在。

二分查找算法的时间复
杂度为O(logn),其中n为数据的长度。

三、哈希查找算法
哈希查找算法是一种利用哈希表进行查找的算法,它的基本思想是将数据通过哈希函数映射到哈希表中,然后在哈希表中查找目标元素。

哈希查找算法的时间复杂度为O(1),但是它需要额外的空间来存储哈希表。

四、树查找算法
树查找算法是一种利用树结构进行查找的算法,它的基本思想是将数据构建成一棵树,然后在树中查找目标元素。

树查找算法的时间复杂度为O(logn),但是它需要额外的空间来存储树结构。

总结:
C语言中的查找算法有顺序查找算法、二分查找算法、哈希查找算法和树查找算法。

不同的算法适用于不同的场景,我们可以根据实际情况选择合适的算法来进行查找。

在实际应用中,我们还可以将不同的算法进行组合,以达到更高效的查找效果。

二分查找 c语言

二分查找 c语言

二分查找c语言摘要:1.二分查找算法简介2.二分查找算法在C语言中的实现3.示例代码及解析4.影响查找速度的因素5.总结与拓展正文:一、二分查找算法简介二分查找(Binary Search)是一种在有序数组中查找特定元素的搜索算法。

相较于顺序查找,二分查找能够在一定程度上提高搜索效率。

它通过将待查找元素与有序数组的中间元素进行比较,根据比较结果进行下一步查找,从而缩小查找范围。

这个过程持续到找到目标元素或查找范围为空。

二、二分查找算法在C语言中的实现以下是二分查找算法在C语言中的基本实现:```cvoid binary_search(int arr[], int len, int target) {int left = 0;int right = len - 1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {printf("找到目标元素,索引为:%d ", mid);return;} else if (arr[mid] < target) {left = mid + 1;} else {right = mid - 1;}}printf("未找到目标元素");}```三、示例代码及解析以下是一个使用上述二分查找算法的示例:```c#include <stdio.h>int main() {int arr[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};int len = sizeof(arr) / sizeof(arr[0]);int target = 11;binary_search(arr, len, target);return 0;}```编译并运行上述代码,输出结果为:```找到目标元素,索引为:5```四、影响查找速度的因素1.有序性:有序数组中的元素分布对二分查找的效率有很大影响。

详解C语言中二分查找的运用技巧

详解C语言中二分查找的运用技巧

详解C语⾔中⼆分查找的运⽤技巧⽬录基础的⼆分查查找左侧边界查找右侧边界⼆分查找问题分析实例1: 爱吃⾹蕉的珂珂实例2:运送包裹前篇⽂章聊到了⼆分查找的基础以及细节的处理问题,主要介绍了查找和⽬标值相等的元素、查找第⼀个和⽬标值相等的元素、查找最后⼀个和⽬标值相等的元素三种情况。

这些情况都适⽤于有序数组中查找指定元素这个基本的场景,但实际应⽤中可能不会这么直接,甚⾄看了题⽬之后,都不会想到可以⽤⼆分查找算法来解决。

本⽂就来分析下⼆分查找在实际中的应⽤,通过分析⼏个应⽤⼆分查找的实例,总结下能使⽤⼆分查找算法的⼀些共同点,以后⼤家遇到相关的实际问题时,能有⼀个基本的分析⽅法,不⾄于⼀点⼉头绪也没有。

基础的⼆分查找先来回顾下基础的⼆分查找的基本框架,⼀般实际场景都是查找和 target 相等的最左侧的元素或者最右侧的元素,代码如下:查找左侧边界int binary_search_firstequal(vector<int> &vec, int target){int ilen = (int)vec.size();if(ilen <= 0) return -1;int left = 0;int right = ilen - 1;while (left <= right){int mid = left + (right - left) / 2;//找到了⽬标,继续向左查找⽬标if (target == vec[mid]) right = mid - 1;else if(target < vec[mid]) right = mid -1;else left = mid + 1;}if(right + 1 < ilen && vec[right + 1] == target) return right+1;return -1;}查找右侧边界int binary_search_lastequal(vector<int> &vec, int target){int ilen = (int)vec.size();if(ilen <= 0) return -1;int left = 0;int right = ilen - 1;while (left <= right){int mid = left + (right - left) / 2;//找到了⽬标,继续向右查找⽬标if (target == vec[mid]) left = mid + 1;else if(target < vec[mid]) right = mid -1;else left = mid + 1;}if(left - 1 < ilen && vec[left - 1] == target) return left - 1;return -1;}⼆分查找问题分析⼆分查找问题的关键是找到⼀个单调关系,单调递增或者单调递减。

查找算法之二分查找算法

查找算法之二分查找算法

查找算法之二分查找算法二分查找算法(Binary Search)是一种在有序数组中快速查找目标值的算法。

它的基本思想是通过不断二分待查找区间,缩小查找范围,直到找到目标值或者确定目标值不存在。

二分查找算法的实现步骤如下:1. 确定待查找数组的起始位置 low 和结束位置 high,初始时 low = 0,high = 数组长度减12. 计算中间位置 mid,mid = (low + high) / 23.将目标值与中间位置的元素进行比较。

-如果目标值等于中间位置的元素,则找到目标值,返回中间位置。

- 如果目标值小于中间位置的元素,则目标值在数组的前半部分,更新 high = mid - 1,回到步骤2进行下一轮查找。

- 如果目标值大于中间位置的元素,则目标值在数组的后半部分,更新 low = mid + 1,回到步骤2进行下一轮查找。

4. 当 low 大于 high 时,代表目标值不存在于数组中,查找结束,返回 -1二分查找算法的时间复杂度为 O(log n),其中 n 为数组长度。

由于每次查找都将查找范围缩小一半,所以它比线性查找算法的效率高很多。

除了基本的二分查找算法,还有一些变体的二分查找算法,如查找第一个与目标值相等的元素、查找最后一个与目标值相等的元素、查找第一个大于目标值的元素、查找最后一个小于目标值的元素等。

这些变体算法在算法思想上与基本的二分查找类似,只是在比较目标值与中间位置元素时稍微有所不同,并通过不同的条件更新 low 和 high 的值,从而实现不同的查找逻辑。

综上所述,二分查找算法是一种高效的查找算法,应用广泛且实用。

它的核心思想简单明了,通过将待查找区间逐渐缩小,快速定位目标值。

在实际应用中,我们需要根据具体问题场景选择恰当的二分查找算法,并注意一些特殊情况的处理,如数组为空、数组长度为0等。

二分法查找数值

二分法查找数值

二分法查找数值
二分法查找数值
二分法,也叫二分查找,是一种在有序数组中查找特定元素的算法。

其基本思想是每次取数组中间的值与目标值进行比较,然后根据比较结果舍弃一半的数据,直到找到目标值或者发现目标值不存在为止。

二分法查找数值的具体步骤如下:
1. 初始化左右指针,left=0,right=n-1。

(n为数组长度)
2. 当left小于等于right时,进行以下操作:
3. 取中间值middle=(left+right)/2。

4. 如果中间值等于目标值,返回目标值的位置。

5. 如果中间值大于目标值,说明目标值在middle的左侧,将right更新为middle-1。

6. 如果中间值小于目标值,说明目标值在middle的右侧,将left更
新为middle+1。

7. 如果循环结束还没有找到目标值,说明目标值不存在,返回-1。

二分法的时间复杂度为O(logN),是一种十分高效的查找算法,因此
在很多情况下都被广泛应用。

其中包括在数据量较大的有序数组中查
找特定元素,以及在游戏中对答案进行猜测等。

总之,二分法通过逐步缩小查找范围,可以快速高效地查找指定元素,是一种很实用的算法。

在实际使用时,需要注意的是数组必须是有序的,否则无法保证算法正确性。

同时,由于函数栈空间有限,在数据
量较大时需要注意是否会爆栈。

二分法查找(C语言)

二分法查找(C语言)

⼆分法查找(C语⾔)⼆分法是⼀种⾼效的查找⽅法,其适⽤于已经排好序的数组基本思路从数组最中间的数开始查找判断,若不是需要查找的数字,则⽐较⼤⼩,之后则在从中间分开的两边中的⼀边从最中间开始查找判断,以此类推算法描述这⾥以升序数组为例,降序数组类似1. 记录数组最中间数的下标,将其中的数与要查找的数进⾏⽐较2. 若相等,停⽌查找,若⼤于要查找的数,则将数组下标上限换为较⼤半区的最⼩下标;若⼩于要查找的数,则将数组下标的下限换为较⼩半区的最⼤下标3. 重复第⼀步,直到数组下标不能调换,若查找到则停⽌查找,若未找到,则返回不存在的结果代码实现这⾥以升序数组为例,降序数组类似# include<stdio.h>int f(int, int [], int);int main(){int n;int arr[10]={1,2,3,4,5,6,7,8,9,10};scanf("%d", &n);//输⼊要查找的数int m=f(n, arr, 10-1);if(f(n, arr, 10-1)!=-1)printf("该数所在下标为:%d\n", m);elseprintf("该数不存在\n");}int f(int n, int a[], int h){int i, l, mid;l = 0;while(l<=h)//注意有等号,因为可能最后⼀次查找就只剩⼀个数,则这时上下限下标相等{mid=(l+h)/2;//计算中间下标if(a[mid]==n)//判断是否为⽬标数return mid;else if(a[mid]<n)l=mid+1;//如果中间数⼩于⽬标数,则将数组下限改为较⼤半区的下限elseh=mid-1;//如果中间数⼤于⽬标数,则将数组上限改为较⼩半区的上限}return -1;//返回-1表⽰⽬标数不存在}。

二分查找(用c语言实现)

二分查找(用c语言实现)

⼆分查找(⽤c语⾔实现)(⼀)⼆分查找有⼀个前提条件:所查找的数组必须是有序的。

(⼆)查找过程如下(假设需要查找的数保存在变量item中):1.设数组的第⼀项索引为low,最后⼀项索引为hight,中间项索引为mid(这⾥我⽤“mid”表⽰中间项的值,“low”表⽰第⼀项的值,"high"表⽰最后⼀项的值);2.⽐较“mid”与item;3.若“mid”>item,则表明item位于数组的前半部分,所以设置high的值为mid-1;4.若“mid”<item,则表明item位于数组的后半部分,所以设置low的值为mid+1;5.若high>low,设置mid为(low+hight)/2(即low到high的中间项),返回步骤2;6.直到查到了⼀项与item相等,或者high<low为⽌;7.判断“mid”与item是否相等,若相等则表明查找成功,否则表明查找失败(即未找到)。

(三)下⾯是我⽤c语⾔实现⼆分查找的代码(关键代码为函数search):1 #include<stdio.h>2int main()3 {4void order(int a[], int n);5int search(int a[], int n, int item);6void output(int a[], int n);7int a[] = { 10,99,22,90,46,89,55,88,60,70 };8int item, index;9 printf("请输⼊需要查询的数字:");10 scanf_s("%d", &item);11 order(a, 10);12 index = search(a, 10, item);13 output(a, 10);14if (index != -1)15 {16 printf("%d为数组的第%d项。

二分查找函数c语言源代码,用C语言实现二分查找算法(示例代码)

二分查找函数c语言源代码,用C语言实现二分查找算法(示例代码)

⼆分查找函数c语⾔源代码,⽤C语⾔实现⼆分查找算法(⽰例代码)⼆分查找算法思想⾮常简单,就是折半查找⼀个有序序列,在这⾥,我⽤⼆分查找⼀个顺序排列的整形数组。

若⽤C实现的话我们需要注意以下⼏个⽅⾯:1.如何判断查找完成,定义返回值含义,定义退出循环条件2.如何处理边界问题,例如1 2 3 这个序列,当我们要查找1或者3时,会不会使程序出现BUG3.对于数列来说,我们通常⽤整形存储其下标,⼆分查找若取下标中间数,则会出现什么样的问题?这些问题是否会影响我们的查找,若有问题,则应该如何规避?通常情况,作为⼀个初学者,我甚⾄觉得⼆分查找过于简单,不值⼀提,最近经过思考,⼆分查找算法对于理论的要求并不是很⾼,但是若要把它变为有可⾏性的程序代码,则我们需要思考诸多的细节,否则这个代码写出来则是错误百出的。

如何解决第⼀个问题,因为我们了解的⼆分查找的思路其实就是折半查找,要有左边界与右边界我们才能确定中间元素,当左边界与右边界重合的时候,这时查找对象就变为⼀个元素的,若它也不是索要查找的对象,那么在所查找的集合中便没有所需的元素。

这样我们就清楚地定义出来了所需参数,以及退出查找的条件。

我们需要⼀个左边界以及右边界,还有中间元素,若右边界⽐左边界⼩(左⽐右⼤)时,退出循环,返回异常。

若否,则执⾏ 查找语句。

这⾥的查找语句如何设计呢,若不结合第2,3个问题,我们可以随⼿写出代码:while(left<=right){mid=(left+right)/2;if(x>mid)left=mid;else if(xright=mid;elsereturn mid;}return error;显然这样做的话实在是太理想了,按出数学的思路,这样做是根本取不到边界的,如果考虑到C语⾔中的整形会⾃动舍弃⼩数,那么对于左边界是我们这样写是完全可以的,但是右边界是永远都不会取到的,如果取中间值取到⾮整数,是否会在其他⽅⾯影响到我们的查找结果呢,答案是不会的,若产⽣⾃动舍弃⼩数的状况,仅仅只会影响我们在⼀个有序序列中查找元素的位置与分段查找所分段的长度,并不会影响我们的查找结果,如果要解决边界问题,我们可以使分段所产⽣的边界偏移,由于mid元素已经被判断过了,所以我们分段的时候段的边界可以直接舍弃掉mid元素,使得边界为mid+1或mid-1,这样我们便完成了整型数组的⼆分查找,实现代码如下:#include //⼆分查找算法即测试⽤例int BinySerch(int *arr, int x, int lengh)//设计参数,由于是整形数组,所以我们必须传递他{ //长度否则数组传参时会发⽣降级int left = 0, right = lengh - 1;int mid ;while (left <= right){mid = left + (right - left) / 2;if (x{right = mid - 1;}else if (x > arr[mid]){left = mid + 1;}else{return mid;}}return -1;}int main()//测试⽤例{int x = 0;int arr[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int lengh = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i{printf("%d ",BinySerch(arr, i, lengh));}system("pause");return 0;}若有不⾜之处,希望批评指正。

二分法查找原理

二分法查找原理

二分法查找原理
二分法查找是一种常用的查找算法,它基于分治思想来快速定位目标元素在有序数组中的位置。

具体原理如下:
1. 首先,将要查找的数组按照升序排列。

2. 然后,取数组的中间元素。

3. 如果中间元素等于目标元素,则返回中间元素所在的位置。

4. 如果中间元素大于目标元素,则在中间元素的左侧子数组中继续查找。

5. 如果中间元素小于目标元素,则在中间元素的右侧子数组中继续查找。

6. 重复以上步骤,直到找到目标元素或者确定目标元素不存在。

这个算法之所以被称为二分法,是因为每一次查找都会将待查找范围缩小一半,因此它的时间复杂度只有O(logn),效率非
常高。

需要注意的是,二分法查找要求目标数组必须是有序的,否则无法保证查找的正确性。

此外,如果数组中存在多个与目标元素相等的元素,二分法查找只能返回其中的一个位置。

总的来说,二分法查找是一种高效的查找算法,适用于有序数组,并且不断将待查找范围缩小的场景。

计算机二分法查找例子

计算机二分法查找例子

计算机二分法查找例子二分法,也称作二分查找,是一种常用的算法,可以用来在有序数组中查找特定元素。

这种算法通过将范围逐渐缩小一半,最终得到结果。

下面我将为您详细介绍二分法查找以及一个具体的例子。

二分法查找算法的基本思想是:首先确定数组的中间位置,如果该位置上的值等于目标值,则查找成功;如果该位置上的值大于目标值,则在数组的前半部分继续进行二分查找;如果该位置上的值小于目标值,则在数组的后半部分继续进行二分查找。

不断重复以上过程,直到找到目标值或者范围缩小为空。

以下是一个使用二分法查找的例子:假设有一个有序数组arr[],其元素值为:[2, 4, 6, 8, 12, 16, 18, 22, 28, 34, 40],我们要查找的目标值为16首先,找到数组的中间位置,即arr[5]为16、由于arr[5]等于目标值,所以查找成功,返回结果为索引值5如果要查找的目标值为10,则arr[5]大于目标值,所以继续在数组的前半部分继续进行二分查找。

此时,范围缩小为[2, 4, 6, 8]。

接下来,再次找到数组的中间位置,即arr[2]为6、由于arr[2]小于目标值,所以在数组的后半部分继续进行二分查找。

此时,范围缩小为[8]。

再次找到数组的中间位置,即arr[0]为2、由于arr[0]小于目标值,所以在数组的后半部分继续进行二分查找。

此时,范围缩小为[4]。

最后,再次找到数组的中间位置,即arr[0]为4、由于arr[0]大于目标值,所以在数组的前半部分继续进行二分查找。

此时,范围缩小为空。

由于范围已经缩小为空,所以查找失败,返回结果为-1二分法查找的时间复杂度为O(log n),其中n为数组的长度。

与线性查找相比,二分法查找的效率更高,尤其是在数组较大的情况下。

但是,使用二分法查找的前提是数组必须是有序的。

如果数组是无序的,需要先进行排序操作,然后再使用二分法查找。

总结一下,二分法查找是一种高效的算法,适用于有序数组。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、目的
input: 有序序列 output: 查找结果,如果为-1则未找到目标constrain: 使用两分法进行查找,使查找时间复杂度为O(logn)
二、算法原理
两分搜索算法是一种理解比较简单,但执行效率却十分高的算法。

可以用循环的方式来实现,也可以用递归的方式来实现。

算法原理如图:
通过不断的改变l和u的值来接近要查找的目标值(40)
m = ( 0 + 13 ) / 2 = 6 result: l = 0, u = m – 1 = 5
m = ( 0 + 5 ) / 2 = 2 result: l = m + 1 = 3, u = 5
m = ( 3 + 5 ) / 2 = 4 result: l = 3 , u = m – 1 = 3
三、代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXN 1000000
typedef int DataType;
DataType x[MAXN];
int n = 0;
int binarysearch (DataType t)
{ int l, u, m;
l = 0;
u = n-1;
while (l <= u) {
m = (l + u) / 2;
if (x[m] < t)
l = m+1;
else if (x[m] == t)
return m;
else /* x[m] > t */
u = m-1;
}
return -1;
}
int main(void)
{
int I, target = -1;
int result = -1;
printf(“plea se input n and search target number:\n” );
while (scanf("%d %d ", &n, &target) != EOF) {
for (i = 0; i <= n; i++) {
x[i] = 10*i;
}
result = binarysearch(target);
printf(“search result = %d\n”, result);
}
return 0;
}
四、代码注解
#define MAXN 1000000
typedef int DataType; /*定义数据数型,可增加算法函数的通用性*/ DataType x[MAXN]; int n = 0; /*t为待搜索的目标值*/
int binarysearch (DataType t)
{
int l, u, m;
l = 0; u = n-1;
while (l <= u) { /*目标仍在l和u之间*/
m = (l + u) / 2; /*折半*/
if (x[m] < t) { /*如果中间值小于目标值*/
l = m+1; /*l需要向u靠拢*/
} else if (x[m] == t) { /*如果等于t,则m即为要搜索的位置,返回即可*/
return m;
} else { /*u需要向l靠拢*/
u = m-1;
}
}
return -1; /*如果走到这,说明目标不在序列内,返回失败*/
}
int main(void)
{
int I, target = -1;
int result = -1;
printf(“please input n and search target number:\n” );
while (scanf("%d %d ", &n, &target) != EOF) {
/*初始化输入数组,仅作为示例*/
for (i = 0; i <= n; i++) {
x[i] = 10*i;
}
/*调用搜索函数,并记录搜索结果*/
result = binarysearch(target);
printf(“search result = %d\n”, result);
}
return 0;
}。

相关文档
最新文档