二分查找算法C语言源程序代码
C语言_二分检索法
为了提高查找效率,在一个数组中查找某个数据是否存在时,可以先将数组数据排序,将排序后的数列的中点设置为比较的对象,如果要找的元素的值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。
即假如有序序列中第一个元素或最后一个元素是要检索的数据,则输出该元素,否则比较的结果排除掉数组一半的元素,再在余下的一半数组元素中取中间的一个元素进行比较,并根据比较的结果再次排除一半的数组元素,以此类推,直至最终找到为止。
这就是二分查找(Binary Search),由于二分查找法每次都根据比较结果排除一半的数据,因此也称为“折半查找法”。
二分查找的先决条件是:查找表中的数据元素必须有序。
在二分法中,只能对递增的数组进行查找。
算法步骤:1、首先是确定整个查找区间的中间位置,mid=(left+right)/2;2、用待查数据的值与中间位置的数据值进行比较:若相等,则查找成功;若大于,则在后半区域继续进行二分查找;若小于,则在前半区域继续进行二分查找。
(这步是循环的过程)3、用二分查找法对确定后的区域再次进行范围缩小的查找,直到查找到结果为止。
/*折半查找递归函数,如果查找成功,函数返回关键字所在位置,否则返回-1*//*p为有序数列,a、b分别为查找区间的起点和终点,key为查找关键字int half(int*p,int a,int b,int key)//a:查找的数组开始元素下标,b:查找数组结束元素下标{int midindex=0;if(a==b){if(key==*(p+a)){return(a);}else{return(-1);}}else{midindex=(a+b)/2;if(key<*(p+midindex)){return(half(p,a,midindex,key));}else if(key>*(p+midindex)){return(half(p,midindex,b,key));}else{return(midindex);}}}这是折半查找的递归算法。
二分查找 c语言
二分查找 c语言【原创实用版】目录1.二分查找算法简介2.二分查找算法的原理3.二分查找算法的实现4.二分查找算法的应用实例5.二分查找算法的优缺点正文【二分查找算法简介】二分查找算法,又称折半查找算法,是一种在有序数组中查找特定元素的搜索算法。
它的原理是从数组的中间元素开始比较,如果中间元素正好是要查找的元素,则查找成功;如果中间元素小于或大于要查找的元素,则在数组大于或小于中间元素的那一半区域里查找,依次类推,直到找到要查找的元素,或者区域减小到无法再分为止。
【二分查找算法的原理】二分查找算法的原理是通过不断地缩小查找范围,从而提高查找效率。
假设我们要在一个长度为 n 的有序数组中查找目标元素 x,我们可以先找到数组的中间元素 mid,然后比较 mid 与 x 的大小。
如果 mid 等于x,则查找成功;如果 mid 小于 x,说明目标元素位于 mid 的右侧,我们将在数组的右侧一半区域里查找;如果 mid 大于 x,说明目标元素位于 mid 的左侧,我们将在数组的左侧一半区域里查找。
这样,每次比较后,查找范围都会缩小一半,因此查找效率较高。
【二分查找算法的实现】下面是二分查找算法的 C 语言实现:#include <stdio.h>int binary_search(int arr[], int len, int target) { int mid;for (mid = 0; mid < len; mid++) {if (arr[mid] == target) {return mid;}}return -1;}int main() {int arr[] = {1, 3, 5, 7, 9, 11, 13, 15};int len = sizeof(arr) / sizeof(arr[0]);int target = 7;int result = binary_search(arr, len, target); if (result!= -1) {printf("找到目标元素,索引为%d", result);} else {printf("未找到目标元素");return 0;}```【二分查找算法的应用实例】二分查找算法在许多场景下都有应用,例如在数据库中查找特定记录、在文件系统中定位文件等。
C语言中的搜索算法详解
C语言中的搜索算法详解搜索算法在计算机科学中起着重要的作用,它们可以帮助我们在大量数据中迅速找到目标元素。
在C语言中,有多种搜索算法可供选择。
本文将深入探讨一些常用的搜索算法,包括线性搜索、二分搜索和哈希表搜索。
一、线性搜索线性搜索是最简单的搜索算法之一,也被称为顺序搜索。
它逐个比较列表中的元素,直到找到目标元素或搜索完整个列表。
这种算法适用于无序列表,并且其时间复杂度为O(n),其中n为列表的长度。
在C语言中,我们可以使用for循环来实现线性搜索算法。
下面是一个示例代码:```c#include <stdio.h>int linear_search(int arr[], int n, int target) {for(int i = 0; i < n; i++) {if(arr[i] == target) {return i;}}return -1;}int main() {int arr[] = {1, 2, 3, 4, 5};int n = sizeof(arr) / sizeof(arr[0]);int target = 3;int result = linear_search(arr, n, target);if(result != -1) {printf("目标元素在列表中的索引为:%d\n", result);} else {printf("目标元素不在列表中。
\n");}return 0;}```二、二分搜索二分搜索是一种更有效的搜索算法,前提是列表已经按照升序或降序排列。
它通过将目标元素与列表的中间元素进行比较,并根据比较结果将搜索范围缩小一半。
这种算法的时间复杂度为O(logn),其中n 为列表的长度。
在C语言中,我们可以使用递归或迭代的方式实现二分搜索算法。
下面是一个使用迭代方式实现的示例代码:```c#include <stdio.h>int binary_search(int arr[], int low, int high, int target) {while(low <= high) {int mid = (low + high) / 2;if(arr[mid] == target) {return mid;} else if(arr[mid] < target) {low = mid + 1;} else {high = mid - 1;}}return -1;}int main() {int arr[] = {1, 2, 3, 4, 5};int n = sizeof(arr) / sizeof(arr[0]);int target = 3;int result = binary_search(arr, 0, n - 1, target);if(result != -1) {printf("目标元素在列表中的索引为:%d\n", result);} else {printf("目标元素不在列表中。
数据结构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为关键字排序,然后进行二分查找。
C基础算法之二分法查找
C基础算法之⼆分法查找算法:当数据量很⼤适宜采⽤该⽅法。
采⽤⼆分法查找时,数据需是排好序的。
基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始⽐较,如果当前位置值等于x,则查找成功;若x⼩于当前位置值,则在数列的前半段中查找;若x⼤于当前位置值则在数列的后半段中继续查找,直到找到为⽌。
⼆分法查找在针对⼤量有序排列的情况下发挥出很优越的效率,这⾥以最具规律性的数组为例,代码如下:⽰例代码:/* binarysearch2.c ---** Filename: binarysearch2.c* Description: ⽤循环⽅式和递归两种⽅式实现⼆分法查找过程* Author: magc* Maintainer:* Created: 三 7⽉ 25 23:26:52 2012 (+0800)* Version:* Last-Updated: 四 7⽉ 26 00:22:37 2012 (+0800)* By: magc* Update #: 74* URL:* Keywords: 递归⼆分法查找* Compatibility:**//* Commentary:****//* Change Log:* 添加循环⽅式和递归⽅式**//* Code: */#include <assert.h>#include <ctype.h>#include <errno.h>#include <limits.h>#include <string.h>#include <stdarg.h>#include <stdlib.h>#include <stdio.h>int binarysearch(int arr[],int len,int key);int binarysearch2(int array[],int key,int low,int high);int main(int argc, char * argv[]){int array[] = {3,5,6,7,11,22,44,47 };int i;printf("请参照下列数组,输⼊你要查找的⽬标:\n {");int len = sizeof(array)/sizeof(int);for (i = 0; i < len; i++) {printf("%d,",array[i]);}printf("}:\n");int dest;scanf("%d",&dest);int res = binarysearch(array,len,dest);printf("1. res = %d\n",res);int res2 = binarysearch2(array,dest,0,len - 1);printf("2. res = %d\n",res2);}/**************************************************************************函数名称:⽤循环实现⼆分法查找过程,功能描述:输⼊参数:返回:返回⽬标值在数组中的下标**************************************************************************/int binarysearch(int arr[],int len,int key){int high,low;high = len - 1;//假设数组是从⼩到⼤排列的low = 0;int midle = len/2;while(high >= low){midle = (high + low)/2;if(arr[midle] == key)return midle;if(arr[midle] > key)high = midle - 1; //前提是假设数组是从⼩到⼤排序,否则不确定是该加1还是减1else if(arr[midle] < key )low = midle + 1;}return (-1);}/**************************************************************************函数名称:⽤递归实现⼆分法查找功能描述:输⼊参数:返回:**************************************************************************/int binarysearch2(int array[],int key,int low,int high){if (low >= high)return (-1);int midle = (low + high)/2;if(array[midle] == key)return midle;if(midle == high || midle == low) //此时,只剩下了下标为high和low的两个数,确定另⼀个数不是key后,就确定查找完毕,并且未找到⽬标值 {if(array[high] == key)return high;else if(array[low] == key)return low;elsereturn (-1);}else if(array[midle] > key)return binarysearch2(array,key,low,midle); //由于不确定排序⽅向,所以此处只能⽤midle值,⽽不能加1或减1else if(array[midle] < key) //当中间值⼩于⽬标值时,在high的⼀侧继续查找,low变到midle位置上return binarysearch2(array,key,midle,high);}/* binarysearch2.c ends here */在GCC下编译运⾏结果如下:注:1)在第⼀个⽅法中,要体会到⼆分法查找的思路,设置high和low参数的好处是,不论数组是从⼤到⼩还是从⼩到⼤排列,此函数皆适⽤。
查找算法之一二分查找(递归实现)
查找算法之一二分查找(递归实现)二分查找又称二分,是一种在有序数组中查找目标值的算法。
其基本思想是将查找范围不断分成两半,然后判断目标值在哪一半,从而减少查找的范围,直到找到目标值或者确定不存在。
二分查找的递归实现相对于迭代实现,代码更加简洁清晰,但运行时的额外空间开销较大,因为每一次递归调用都会创建新的栈帧。
下面是二分查找的递归实现的代码示例:```pythondef binary_search_recursive(arr, target, left, right):if left <= right:mid = left + (right - left) // 2if arr[mid] == target:return midelif arr[mid] > target:return binary_search_recursive(arr, target, left, mid - 1) else:return binary_search_recursive(arr, target, mid + 1, right) else:return -1```接下来我们来详细解析一下这段代码的实现原理。
在递归函数`binary_search_recursive`中,有四个参数:`arr`表示有序数组,`target`表示要查找的目标值,`left`表示当前查找范围的左边界,`right`表示当前查找范围的右边界。
递归函数首先判断当前查找范围是否合法,即`left <= right`。
如果不合法,则说明要查找的目标值不存在于当前查找范围中,返回-1表示查找失败。
接下来,计算当前查找范围的中间位置`mid`,使用`(left + right) // 2`的方式来计算防止整型溢出。
然后,判断中间位置的元素与目标值的大小关系。
如果中间位置的元素等于目标值,表示查找成功,直接返回中间位置的索引。
如果中间位置的元素大于目标值,说明目标值应该在当前查找范围的左半边,那么再次以左半边为查找范围进行递归查找。
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.}运行结果:。
对分查找算法及程序实现
对分查找算法及程序实现一、二分查找算法二分查找又称折半查找,是一种在有序数组中查找其中一特定元素的算法。
它的基本思想是:将数组的中间位置的数与要查找的数据比较,如果查找数据比中间位置的数小,则在数组的低半部分继续进行查找;如果查找数据比中间位置的数大,则在数组的高半部分继续查找;直到找到该数据或者查找范围为空为止。
二分查找的时间复杂度为O(log n),由于其基本思想是二分法,所以称之为二分查找。
二、二分查找算法的实现1、二分查找的实现//二分查找// arr:被查找的有序数组// item:要查找的项int binary_search(int arr[], int size, int item)int low = 0;int high = size;int middle;while(low <= high)middle = (low + high)/2;return middle;else if (arr[middle] < item)low = middle + 1;elsehigh = middle - 1;}return -1; // 表示没有找到2、二分查找的递归实现//二分查找的递归实现// arr:被查找的有序数组// item:要查找的项// low :数组的低位下标// high:数组的高位下标int binary_search_recursive(int arr[], int item, int low, int high)if (low > high)return -1; // 表示没有找到int middle = (low + high) / 2;return middle;else if (arr[middle] < item)return binary_search_recursive(arr, item, middle + 1, high);elsereturn binary_search_recursive(arr, item, low, middle - 1);三、二分查找算法程序实现#include <iostream>using namespace std;//二分查找// arr:被查找的有序数组// item:要查找的项int binary_search(int arr[], int size, int item)int low = 0;int high = size;。
C语言实现折半查找法(二分法)
C语⾔实现折半查找法(⼆分法)折半查找法也叫做⼆分查找,顾名思义,就是把数据分成两半,再判断所查找的key在哪⼀半中,再重复上述步骤知道找到⽬标key;注意:折半查找法仅适⽤于对已有顺序的数组、数据进⾏操作很显然,折半查找法相对于其他查找⽅法例如顺序查找法效率要⾼很多;下⾯我们来实际操作⼀下,了解⼆分查找的奥义。
例如:要在数组arr[]={8,7,9,6,4,1,2,5,3,10,11};中查找key=7的位置;⾸先,我们要先将数组arr中的数据成员进⾏排序。
arr[]= {1,2,3,4,5,6,7,8,9,10,11};如图所⽰:将该组数据⼩端记作low,⼤端记作high,中间值记作mid;⼆分法查找时,将所查找的key与mid⽐较,例如key=7,即可缩⼩查找范围在mid和high之间;如图所⽰即可找到key=low=7;注意:(敲⿊板)如果中间数mid不是整数,需要进⾏取整。
代码如下:#include<stdio.h>int BinSearch(int arr[],int len,int key) //折半查找法(⼆分法){int low=0; //定义初始最⼩int high=len-1; //定义初始最⼤int mid; //定义中间值while(low<=high){mid=(low+high)/2; //找中间值if(key==arr[mid]) //判断min与key是否2020111122411718相等return mid;else if(key>arr[mid]) //如果key>mid 则新区间为[mid+1,high]low=mid+1;else //如果key<mid 则新区间为[low,mid-1]high=mid-1;}return -1; //如果数组中⽆⽬标值key,则返回 -1 ;}int main(){int arr[]={1,2,3,4,5,6,7,8,9,10,11}; //⾸先要对数组arr进⾏排序printf("%d \n",BinSearch(arr,(sizeof(arr)/sizeof(arr[0])),7));return 0;}运⾏结果如下:希望对您有所帮助!以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
经典c语言二分法
经典c语言二分法二分法的时间复杂度为O(logn),是一种高效的查找算法,在处理大型数据集时非常实用。
本文将通过C语言实现二分法的基本原理和应用,以帮助读者更深入地理解这一经典算法。
1. 二分法的基本原理在有序数组中查找目标元素时,二分法的基本思路是不断地将当前查找范围缩小为一半,直到找到目标元素或者确定目标元素不存在于数组中。
具体步骤如下:(1)首先确定查找范围的起始位置start和结束位置end,初始化为数组的第一个和最后一个元素的下标。
(2)计算当前查找范围的中间位置mid,即mid = (start + end) / 2。
(3)比较目标元素与数组中间位置的元素的大小关系,如果相等则找到目标元素,返回对应的下标;如果目标元素比中间位置的元素大,则将查找范围缩小为[mid+1, end];如果目标元素比中间位置的元素小,则将查找范围缩小为[start, mid-1]。
(4)重复步骤(2)和(3),直到找到目标元素或者确定目标元素不存在于数组中。
二分法的核心思想就是不断地将查找范围缩小为一半,通过对比目标元素和中间位置的元素的大小关系进行迭代,最终找到目标元素的位置。
2. 二分法的C语言实现接下来我们将通过C语言来实现二分法的基本原理。
首先我们定义一个简单的有序数组作为示例,然后编写二分法查找目标元素的函数。
```c#include <stdio.h>// 二分法查找目标元素的函数int binarySearch(int arr[], int n, int target) {int start = 0;int end = n - 1;while (start <= end) {int mid = (start + end) / 2;if (arr[mid] == target) {return mid; // 找到目标元素,返回下标}else if (arr[mid] < target) {start = mid + 1; // 缩小查找范围为[mid+1, end] }else {end = mid - 1; // 缩小查找范围为[start, mid-1]}}return -1; // 目标元素不存在于数组中}int main() {int arr[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};int n = sizeof(arr) / sizeof(arr[0]);int target = 13;int result = binarySearch(arr, n, target);if (result != -1) {printf("目标元素%d的下标为%d\n", target, result); }else {printf("目标元素%d不存在于数组中\n", target);}return 0;}```上述代码中,我们首先定义了一个有序数组arr作为示例,然后编写了二分法查找目标元素的函数binarySearch。
二分查找算法C语言源程序代码
二分查找算法C语言源程序代码以下是一个使用二分查找算法的C语言源代码程序,包括了详尽的注释解释每一步的操作和算法原理。
```c#include <stdio.h>//二分查找函数int binarySearch(int arr[], int left, int right, int target) //当左边界大于右边界时,表示查找失败,返回-1if (left > right)return -1;}//计算数组中间元素的下标int mid = left + (right - left) / 2;//判断中间元素是否等于目标值if (arr[mid] == target)return mid;}//如果中间元素大于目标值,说明目标值可能在左半部分,调用递归在左半部分继续查找if (arr[mid] > target)return binarySearch(arr, left, mid - 1, target);}//如果中间元素小于目标值,说明目标值可能在右半部分,调用递归在右半部分继续查找if (arr[mid] < target)return binarySearch(arr, mid + 1, right, target);}int maiint arr[] = {2, 5, 8, 12, 16, 23, 38, 56, 72, 91};int n = sizeof(arr) / sizeof(arr[0]); // 计算数组的长度int target = 23; // 目标值int result = binarySearch(arr, 0, n - 1, target); // 调用二分查找函数if (result == -1)printf("目标值不存在\n");} elseprintf("目标值在数组中的位置为:%d\n", result);}return 0;```该程序首先定义了一个名为 `binarySearch` 的函数,用于实现二分查找算法。
用循环实现二分法查找过程(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++代码
二分法c++代码二分法是一种在有序数组中查找特定元素的常用算法。
它通过将数组分成两部分并不断缩小搜索范围来快速定位目标元素。
以下是一个使用二分法在C++中查找特定元素的示例代码:```cpp#include <iostream>using namespace std;int binarySearch(int arr[], int left, int right, int target) {while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid;}else if (arr[mid] < target) {left = mid + 1;}else {right = mid - 1;}}return -1; // 表示目标元素未找到}int main() {int arr[] = {2, 4, 6, 8, 10, 12, 14};int target = 8;int size = sizeof(arr) / sizeof(arr[0]);int result = binarySearch(arr, 0, size - 1, target);if (result == -1) {cout << '目标元素未找到' << endl;}else {cout << '目标元素在索引 ' << result << ' 处' << endl; }return 0;}```在上述代码中,我们定义了一个名为`binarySearch`的函数,它接受一个有序数组`arr`、左边界`left`、右边界`right`和目标元素`target`作为参数。
二分查找 c++
二分查找 c++
二分查找(Binary Search)是一种在有序数组中查找特定元素的技术。
它是
一种非常高效的搜索技术,其时间复杂度为O(logn)。
二分查找要求数据集是有序的,所以我们需要先将数据集排序,才能使用二分查找。
将整个数据集分成两部分,选定中间值,如果中间值大于目标值,那么在左半部分继续查找;如果中间值小于目标值,那么在右半部分继续查找;如果找到了目标值则结束查找。
这种技术每次折半查找,时间复杂度十分低,最坏情况下仅为O (logn),所以非常适合大量数据的搜索。
用C++实现二分查找的代码大致如下:
int binarySearch(vector<int>& nums, int target)
{
int left = 0, right = nums.size() - 1;
while(left <= right)
{
int mid = left + (right - left)/2;
if(nums[mid] == target)
return mid;
else if(nums[mid]> target)
right = mid - 1;
else
left = mid + 1;
}
return -1;
}
总的来说,二分查找是一种比较经典的搜索算法,它的时间复杂度比较低,非
常适合大量数据的查找,它的实现非常简单,而C++又拥有一系列强大的函数库,
使它变得更加简单。
而C++中代码实现更加清晰,只要我们按照代码的特性设计算法,我们就能轻松的实现。
二进制搜索算法的实现步骤与代码示例
二进制搜索算法的实现步骤与代码示例二进制搜索算法,也被称为二分查找算法,是一种高效的搜索算法。
它适用于有序数组或列表,并通过将目标值与数组的中间元素进行比较,从而将搜索范围缩小一半。
以下将介绍二进制搜索算法的实现步骤,并提供代码示例。
步骤一:确定搜索范围首先,我们需要确定要搜索的范围。
假设我们有一个有序数组arr,我们要搜索的目标值为target。
我们可以将搜索范围初始化为整个数组,即左边界为0,右边界为数组的长度减1,即left = 0,right = len(arr) - 1。
步骤二:计算中间位置接下来,我们需要计算搜索范围的中间位置。
我们可以使用以下公式来计算中间位置mid:mid = (left + right) // 2步骤三:比较目标值与中间元素现在,我们将目标值与中间位置的元素进行比较。
如果目标值等于中间位置的元素arr[mid],则找到了目标值,搜索结束。
如果目标值小于中间位置的元素arr[mid],则目标值必定在左半部分,将搜索范围缩小为左半部分,即right = mid - 1。
如果目标值大于中间位置的元素arr[mid],则目标值必定在右半部分,将搜索范围缩小为右半部分,即left = mid + 1。
步骤四:重复步骤二和步骤三我们重复步骤二和步骤三,直到找到目标值或者搜索范围为空。
如果搜索范围为空,说明目标值不存在于数组中,搜索结束。
下面是二进制搜索算法的代码示例:```def binary_search(arr, target):left = 0right = len(arr) - 1while left <= right:mid = (left + right) // 2if arr[mid] == target:return midelif arr[mid] < target:left = mid + 1else:right = mid - 1return -1```以上代码实现了一个二进制搜索函数binary_search,它接受一个有序数组arr 和目标值target作为输入,并返回目标值在数组中的索引。
C++二分查找(折半查找)算法实例详解
C++⼆分查找(折半查找)算法实例详解本⽂实例讲述了C++⼆分查找(折半查找)算法。
分享给⼤家供⼤家参考,具体如下:⼆分查找⼜称折半查找,优点是⽐较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插⼊删除困难。
因此,折半查找⽅法适⽤于不经常变动⽽查找频繁的有序列表。
⼆分查找思想⾸先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字⽐较,如果两者相等,则查找成功;否则利⽤中间位置记录将表分成前、后两个⼦表,如果中间位置记录的关键字⼤于查找关键字,则进⼀步查找前⼀⼦表,否则进⼀步查找后⼀⼦表。
重复以上过程,直到找到满⾜条件的记录,使查找成功,或直到⼦表不存在为⽌,此时查找不成功。
基本算法C语⾔实现代码:int binary_search(int arr[], int len, int elem){int low = 0;int high = len - 1;while (low <= high){int mid = (low + high) / 2;if (elem == arr[mid]){ //相等,返回midreturn mid;}else if (elem > arr[mid]){low = mid + 1; //元素⽐区间中间元素⼤,取区间中间元素的下⼀个元素作为新区间起始位置}else{high = mid - 1; //元素⽐区间中间元素⼩,取区间中间元素的上⼀个元素作为新区间结束位置}}return -1;}添加检测是否是已排好序数组的程序实例#include <iostream>using namespace std;int binary_search(int arr[], int len, int elem){int low = 0;int high = len - 1;while (low <= high){int mid = (low + high) / 2;if (elem == arr[mid]){return mid;}else if (elem > arr[mid]){low = mid + 1;}else{high = mid - 1;}}return -1;}//检测是否排好序int is_sorted(int arr[], int len){int sorted = 1;for (int i = 0; i < len - 1; i++){sorted = sorted && arr[i] <= arr[i + 1];}return sorted;}int main(){int arr[] = { 1, 3, 5, 7, 9, 11, 12, 15, 18, 23, 25, 26 }; int len = sizeof(arr) / sizeof(int);int pos;int sorted = is_sorted(arr, len);if (sorted){pos = binary_search(arr, len, 26);cout << "pos = " << pos << endl;}system("pause");}运⾏结果:pos = 11请按任意键继续. . .希望本⽂所述对⼤家C++程序设计有所帮助。
二分法c++代码
二分法c++代码二分法是一种分治策略,用于在有序数组中查找特定元素。
它的基本思想是通过将数组分为两部分,并根据目标值与中间元素的大小关系,确定目标值可能出现的区间,然后在该区间继续进行查找,直到找到目标值或确定目标值不存在为止。
下面是一个使用二分法查找目标值的示例代码:```c++#include <iostream>#include <vector>int binarySearch(std::vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {return mid;} else if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1;}int main() {std::vector<int> nums = {2, 5, 8, 12, 16, 23, 38, 56, 72, 91};int target = 16;int index = binarySearch(nums, target);if (index != -1) {std::cout << '目标值 ' << target << ' 在数组中的索引为 ' << index << std::endl;} else {std::cout << '目标值 ' << target << ' 不在数组中' << std::endl;}return 0;}```以上代码表示在一个有序数组 `nums` 中查找目标值 `target`。
c#二分查找算法
c#⼆分查找算法,也称、,是⼀种在中查找某⼀特定元素的搜索算法。
A 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;B 如果某⼀特定元素⼤于或者⼩于中间元素,则在数组⼤于或⼩于中间元素的那⼀半中查找,⽽且跟开始⼀样从中间元素开始⽐较。
C 如果在某⼀步骤数组为空,则代表找不到。
这种搜索算法每⼀次⽐较都使搜索范围缩⼩⼀半。
时间复杂度折半搜索每次把搜索区域减少⼀半,时间复杂度为。
(n代表集合中元素的个数)空间复杂度复制代码代码如下:/// <summary>/// ⼆分查找/// </summary>/// <param name="arr"></param>/// <param name="low">开始索引 0</param>/// <param name="high">结束索引 </param>/// <param name="key">要查找的对象</param>/// <returns></returns>public static int BinarySearch(int[] arr, int low, int high, int key){int mid = (low + high) / 2;if (low > high)return -1;else{if (arr[mid] == key)return mid;else if (arr[mid] > key)return BinarySearch(arr, low, mid - 1, key);elsereturn BinarySearch(arr, mid + 1, high, key);}}实例:复制代码代码如下:int[] y = new int[] {1,2,3,4,5,6,7,8,9,10,11,12,13 };int rr = BinarySearch(y, 0, y.Length - 1, 13);Console.Write(rr); //12。