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++ 二分法查找
二分法查找1、二分查找(Binary Search)二分查找又称折半查找,它是一种效率较高的查找方法。
二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。
不妨设有序表是递增有序的。
2、二分查找的基本思想二分查找的基本思想是:(设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]。
②类似地,若R[mid].key<K,则要查找的K必在mid的右子表R[mid+1..n]中,即新的查找区间是右子表R[mid+1..n]。
下一次查找是针对新的查找区间进行的。
因此,从初始的查找区间R[1..n]开始,每经过一次与当前查找区间的中点位置上的结点关键字的比较,就可确定查找是否成功,不成功则当前的查找区间就缩小一半。
这一过程重复直至找到关键字为K的结点,或者直至当前的查找区间为空(即查找失败)时为止。
3、二分查找算法int BinSearch(SeqList R,KeyType K){ //在有序表R[1..n]中进行二分查找,成功时返回结点的位置,失败时返回零int low=1,high=n,mid;//置当前查找区间上、下界的初值while(low<=high){ //当前查找区间R[low..high]非空mid=(low+high)/2;if(R[mid].key==K) return mid;//查找成功返回if(R[mid].kdy>K)high=mid-1; //继续在R[low..mid-1]中查找elselow=mid+1;//继续在R[mid+1..high]中查找}return 0;//当low>high时表示查找区间为空,查找失败} //BinSeareh二分查找算法亦很容易给出其递归程序【参见练习】4、二分查找算法的执行过程设算法的输入实例中有序的关键字序列为(05,13,19,21,37,56,64,75,80,88,92)要查找的关键字K分别是21和85。
c语言查找算法
c语言查找算法
C语言是一种广泛使用的编程语言,它具有高效、简单、易学等特点,因此在各个领域都有广泛的应用。
在C语言中,查找算法是一种非常
重要的算法,它可以帮助我们在大量数据中快速查找到我们需要的数据。
下面我们将详细介绍C语言中的查找算法。
一、顺序查找算法
顺序查找算法是一种最简单的查找算法,它的基本思想是从数据的第
一个元素开始逐个比较,直到找到目标元素或者遍历完整个数据。
顺
序查找算法的时间复杂度为O(n),其中n为数据的长度。
二、二分查找算法
二分查找算法也称为折半查找算法,它的基本思想是将数据分成两部分,然后判断目标元素在哪一部分中,再在该部分中继续进行查找,
直到找到目标元素或者确定目标元素不存在。
二分查找算法的时间复
杂度为O(logn),其中n为数据的长度。
三、哈希查找算法
哈希查找算法是一种利用哈希表进行查找的算法,它的基本思想是将数据通过哈希函数映射到哈希表中,然后在哈希表中查找目标元素。
哈希查找算法的时间复杂度为O(1),但是它需要额外的空间来存储哈希表。
四、树查找算法
树查找算法是一种利用树结构进行查找的算法,它的基本思想是将数据构建成一棵树,然后在树中查找目标元素。
树查找算法的时间复杂度为O(logn),但是它需要额外的空间来存储树结构。
总结:
C语言中的查找算法有顺序查找算法、二分查找算法、哈希查找算法和树查找算法。
不同的算法适用于不同的场景,我们可以根据实际情况选择合适的算法来进行查找。
在实际应用中,我们还可以将不同的算法进行组合,以达到更高效的查找效果。
C#查找算法1:二分查找
C#查找算法1:⼆分查找⼆分查找也称折半查找(Binary Search),它是⼀种效率较⾼的查找⽅法。
但是,折半查找要求线性表必须采⽤顺序存储结构,⽽且表中元素按关键字有序排列。
原理:将n个元素分成个数⼤致相同的两半,取a[n/2]与欲查找的x作⽐较,1. 如果x=a[n/2]则找到x,算法终⽌;2. 如果x<a[n/2],则我们只要在数组a的左半部继续搜索x3. 如果x>a[n/2],则我们只要在数组a的右半部继续搜索写法⼀:采⽤递归法///<summary>///⼆分法查找,⼆分查找的条件是原数组有序///没有找到,返回-1;找到了,则返回索引///</summary>///<param name="arr">数组</param>///<param name="low">开始索引</param>///<param name="height">结束索引</param>///<param name="value">要查找的对象</param>static int BinarySearch(int[] arr, int low, int high, int value){if (arr == null || arr.Length == 0 || low >= high){return -1;}int mid = (low + high) / 2;if (value == arr[mid]) //刚好找到对象,返回索引{return mid;}else if (value > arr[mid]) // 要查找的对象在右边{return BinarySearch(arr, mid + 1, high,value);}else//要查找的对象在左边{return BinarySearch(arr, low, mid - 1, value);}}写法⼆:static int BinarySearch2(int[]arr,int value){int low = 0, high = arr.Length - 1,mid=0;while (low <= high){mid = (low + high) / 2;if(value== arr[mid]){return mid;}if (value > arr[mid])//在右侧{low = mid + 1;}else//在左侧{high = mid - 1;}}return -1;}运⾏结果static void Main(string[] args){Console.WriteLine($"数据算法");var arr1 = GetArrayData(8, 1, 22);Console.WriteLine($"⽣成未排序数据arr1:{ShowArray(arr1)}");//var arr2 = BubbleSort(arr1);//Console.WriteLine($"冒泡排序:{ShowArray(arr2)}");var arr3 = SelectSort(arr1);Console.WriteLine($"选择排序arr3:{ShowArray(arr3)}");var val = arr3[3];var index= BinarySearch(arr3, 0, arr1.Length - 1,val);Console.WriteLine($"{val}在 arr3中出现的索引位置是{index}");var val2 = arr3[4];var index2 = BinarySearch2(arr3, val2);Console.WriteLine($"{val2}在 arr3中出现的索引位置是{index2}");Console.ReadLine();}。
二分法c语言
二分法c语言二分法又称为折半法,是指一种在有序数列中查找某一特定元素的搜索算法,该算法可以大大减少搜索所需的时间。
这种算法可用于C语言中,并可以极大地提高搜索效率。
在C语言中实现二分法算法的原理非常简单:先从有序数列中间位置开始查找,然后根据查找的值大小,把数列分为两部分,在相应的一部分中继续查找,直到找到要查找的元素为止。
这里需要指出的是,假设要查找的元素不存在,那么该算法在C语言中运行的时间是O(logN),其中N是要查找的元素的数量。
在C语言中,实现二分法的代码非常简单,如下所示:int BinarySearch(int A[], int n, int v){int left = 0;int right = n - 1;while (left <= right){int mid = (left + right) / 2;if (A[mid] == v)return mid;else if (A[mid] > v)right = mid - 1;elseleft = mid + 1;}return -1;}该算法有两个参数,一个是A[],数组存放要查找的数据;另一个参数是v,是要查找的数据值。
在算法初始化的时候,给left和right参数赋值,left赋值为0,right赋值为要查找数据的长度减1,即n-1。
之后,在while循环中,不断判断以及更新left和right的值,直到查找到目标值,返回值为mid,或者left>right 时,返回值为-1。
以上是C语言中实现二分法的一般思路以及代码实现,从实现过程可以看出,二分法在查找有序数组中的元素时,能够在O(logN)的时间内完成,比顺序查找算法快得多。
因此,二分法在编程中可以作为一种非常有效的查找算法,极大地提高搜索效率。
与二分法相比,顺序查找算法在查找有序数组中的元素时,其时间复杂度为O(n),比二分查找算法高得多。
而从实现代码来看,顺序查找算法只需要两个for循环,而二分查找算法则需要while 循环,所以写起来就要复杂得多。
c语言二分查找算法代码
c语言二分查找算法代码C语言二分查找算法是一种非常常用的查找算法,也是一种高效的算法,特别是当数据规模非常大时,它的优势体现得更加明显。
通过对待查找的数据进行二分割,然后迭代比对的方式,二分查找算法能够在较短的时间内准确地定位目标所在的索引位置。
本文将介绍C语言二分查找算法的代码实现,以及如何通过该算法查找并定位数据目标。
1.基本思想C语言二分查找算法是利用了待查找的数据有序的特性,通过将数据逐渐逼近目标值,最终定位目标所在的位置。
具体实现过程如下:(1)首先确定数据的中间位置。
(2)将待查找的目标值与中间位置的值进行比较。
(3)如果目标值等于中间位置的值,则返回中间位置的索引。
(4)如果目标值小于中间位置的值,则将数据的范围缩小到第一项到中间项之间的数据。
(5)如果目标值大于中间位置的值,则将数据的范围缩小到中间项到最后一项之间的数据。
(6)重复以上步骤,直到找到目标值。
二分查找算法的核心思想就是不断缩小数据的范围,将数据迭代划分为两部分,缩小搜索的范围,以快速定位目标值所在的索引位置。
2.代码实现C语言实现二分查找算法虽然简单,但是需要考虑很多边界条件,才能保证算法的正确性和鲁棒性。
下面,我们将介绍二分查找算法的代码实现。
(1)基本二分查找算法```c int binary_search(int *arr, int num, intvalue) { int low = 0, high = num - 1, mid;while(low <= high) { mid = (low + high)/ 2; if(arr[mid] == value)return mid; else if(arr[mid] > value) high = mid - 1; else low = mid+ 1; } return -1; } ```该算法的基本思路已经在上面进行了分析。
该代码实现中,arr为待查找的有序数据,num为数据的个数,value为待查找的目标值。
C语言技术中的查找算法应用技巧
C语言技术中的查找算法应用技巧在计算机科学中,查找算法是一种用于在数据集合中寻找特定元素的方法。
在C语言编程中,掌握查找算法的应用技巧对于提高程序的效率和性能非常重要。
本文将介绍几种常见的查找算法,并探讨它们在C语言技术中的应用技巧。
1. 顺序查找算法顺序查找算法是最简单的一种查找方法。
它的基本思想是逐个比较待查找元素和数据集合中的每个元素,直到找到匹配的元素或遍历完整个数据集合。
在C语言中,可以使用for循环来实现顺序查找算法。
2. 二分查找算法二分查找算法是一种高效的查找方法,但是它要求数据集合必须是有序的。
它的基本思想是将待查找元素与数据集合的中间元素进行比较,如果相等则找到了匹配元素,如果待查找元素小于中间元素,则在数据集合的前半部分继续查找,如果待查找元素大于中间元素,则在数据集合的后半部分继续查找。
通过不断地二分,最终可以找到匹配的元素或确定元素不存在。
在C语言中,可以使用递归或循环来实现二分查找算法。
3. 哈希查找算法哈希查找算法是一种利用哈希函数快速定位元素的查找方法。
它的基本思想是将待查找元素通过哈希函数转换成一个索引,然后在索引对应的位置进行查找。
哈希查找算法的优势在于可以在常数时间内定位元素,但是它要求哈希函数具有良好的性质,避免冲突。
在C语言中,可以使用哈希表来实现哈希查找算法。
4. 二叉查找树二叉查找树是一种基于二叉树结构的查找方法。
它的基本思想是将数据集合构建成一个二叉树,使得每个节点的左子树中的元素小于节点的值,右子树中的元素大于节点的值。
通过比较待查找元素与节点的值,可以确定在左子树或右子树中继续查找。
二叉查找树可以通过递归或循环来实现。
在C语言中,可以使用指针和结构体来表示二叉查找树。
5. B树B树是一种多路搜索树,它的每个节点可以包含多个元素。
B树的基本思想是通过将数据集合分割成多个节点,使得每个节点中的元素有序,并且每个节点的元素个数在一个范围内。
通过比较待查找元素与节点中的元素,可以确定在子节点中继续查找。
二分查找 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语言 二分查找
二分查找从键盘输入某数组数据,然后根据要求采用二分查找法查找输入的值.分析:因为二分查找法必须对有序序列进行操作,因此,在输入数组数据之后,应该首先进行排序工作,,然后采用二分查找相关的数据元素.源程序代码如下所示:/*文件名为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语言实现二分法查找的程序:#include <stdio.h> // 声明函数 int binarySearch(int arr[], int left, int right, int key); // 主函数 int main() { // 定义数组int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; // 计算数组的大小 int size = sizeof(arr) /sizeof(arr[0]); // 要查找的元素 int key = 4; // 用二分法查找 int result = binarySearch(arr, 0, size - 1, key); // 打印查找结果 if (result == -1) printf("元素不存在\n"); else printf("元素位置为:%d\n", result); return 0; } // 二分法查找函数 int binarySearch(int arr[], int left, intright, int key) { // 定义中间位置 intmid; // 当左侧位置小于右侧位置时,循环查找while (left <= right) { // 求出中间位置 mid = (left + right) / 2; //如果查找的key值等于中间位置的元素,则返回元素位置if (key == arr[mid]) return mid;// 如果查找的key值大于中间位置的元素,则从数组的右半部分开始查找 else if (key > arr[mid]) left = mid + 1; // 如果查找的key值小于中间位置的元素,则从数组的左半部分开始查找else right = mid - 1; } //如果查找不到,则返回-1 return -1; }。
C语言常用简单算法
C语言常用简单算法C语言是一门功能强大的编程语言,其算法也是很多的。
下面是一些常用的简单算法:1.二分查找算法:二分查找是一种在有序数组中查找特定元素的算法。
它的基本思想是首先在数组的中间位置找到待查找的元素,如果该元素等于目标值,则查找成功;如果该元素大于目标值,说明目标值在数组的前半部分,则在前半部分继续进行查找;如果该元素小于目标值,则说明目标值在数组的后半部分,则在后半部分继续进行查找。
重复以上步骤,直到找到目标值或者确定目标值不存在。
2.冒泡排序算法:冒泡排序是一种简单直观的排序算法。
它的基本思想是通过反复交换相邻的两个元素,将较大的元素逐渐往后移动,从而实现排序的目的。
具体实现时,每一轮比较都会使最大的元素移动到最后。
3.插入排序算法:插入排序是一种简单直观的排序算法。
它的基本思想是将数组分成已排序部分和未排序部分,每次从未排序部分取出一个元素,然后将该元素插入到已排序部分的合适位置,从而实现排序的目的。
4.选择排序算法:选择排序是一种简单直观的排序算法。
它的基本思想是每次选择一个最小(或最大)的元素放到已排序部分的末尾,从而实现排序的目的。
具体实现时,每一轮选择都通过比较找出未排序部分的最小(或最大)元素。
5.快速排序算法:快速排序是一种高效的排序算法。
它的基本思想是通过选取一个基准元素,将数组分成两个子数组,一个子数组中的元素都小于基准元素,另一个子数组中的元素都大于基准元素,然后对这两个子数组分别进行快速排序,最终实现排序的目的。
6.斐波那契数列算法:斐波那契数列是一列数字,其中每个数字都是前两个数字之和。
常见的斐波那契数列算法有递归算法和迭代算法。
递归算法通过反复调用自身来计算斐波那契数列的值,而迭代算法则通过循环来计算。
7.求最大公约数算法:求两个数的最大公约数是一种常见的问题。
常见的求最大公约数的算法有欧几里得算法和辗转相除法。
欧几里得算法通过不断用较小数除以较大数的余数,直到余数为0,得到最大公约数。
二分查找函数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;}若有不⾜之处,希望批评指正。
二分查找法c语言
二分查找法c语言二分查找法是一种常用的查找算法,也称为折半查找法。
它的主要思想是将查找区间不断地二分,直到找到目标元素或者确定目标元素不存在为止。
在本文中,我将详细介绍二分查找法的原理、应用场景以及具体实现。
一、原理二分查找法的原理非常简单。
首先,需要将待查找的区间确定为一个有序序列。
然后,通过将区间的中间位置的元素与目标元素进行比较,可以确定目标元素位于区间的哪一部分。
若中间元素等于目标元素,则查找成功;若中间元素大于目标元素,则目标元素位于区间的左半部分;若中间元素小于目标元素,则目标元素位于区间的右半部分。
然后,将区间缩小为目标元素所在的那一部分,重复上述步骤,直到找到目标元素或者确定目标元素不存在。
二、应用场景二分查找法适用于有序序列的查找。
在实际应用中,它常被用于在数组或有序列表中查找特定元素的位置或判断某一元素是否存在。
由于二分查找法的时间复杂度为O(logn),远小于线性查找法的O(n),因此它在大规模数据的查找中具有较高的效率。
三、具体实现下面是一个使用C语言实现的二分查找算法的示例代码:```c#include <stdio.h>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, 16, 18, 20};int target = 12;int n = sizeof(arr) / sizeof(arr[0]);int result = binarySearch(arr, 0, n - 1, target);if (result == -1) {printf("目标元素不存在\n");} else {printf("目标元素在数组中的位置为:%d\n", result);}return 0;}```在上述代码中,binarySearch函数接受一个有序数组arr、查找区间的左边界left、查找区间的右边界right以及目标元素target作为参数。
二分法查找(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基础算法之⼆分法查找算法:当数据量很⼤适宜采⽤该⽅法。
采⽤⼆分法查找时,数据需是排好序的。
基本思想:假设数据是按升序排序的,对于给定值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参数的好处是,不论数组是从⼤到⼩还是从⼩到⼤排列,此函数皆适⽤。
二分查找法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语⾔实现)(⼀)⼆分查找有⼀个前提条件:所查找的数组必须是有序的。
(⼆)查找过程如下(假设需要查找的数保存在变量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语言二分查找算法,折半查找算法本实例采用二分查找法查找特定关键字的元素。
要求用户输入数组长度,也就是有序表的数据长度,并输入数组元素和査找的关键字。
程序输出查找成功与否,以及成功时关键字在数组中的位置。
例如,在有序表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语言实现二分查找算法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语⾔⼁⼆分查找算法详解(含⽰例代码)⼆分査找也称折半査找,其优点是查找速度快,缺点是要求所要査找的数据必须是有序序列。
该算法的基本思想是将所要査找的序列的中间位置的数据与所要査找的元素进⾏⽐较,如果相等,则表⽰査找成功,否则将以该位置为基准将所要査找的序列分为左右两部分。
接下来根据所要査找序列的升降序规律及中间元素与所查找元素的⼤⼩关系,来选择所要査找元素可能存在的那部分序列,对其采⽤同样的⽅法进⾏査找,直⾄能够确定所要查找的元素是否存在,具体的使⽤⽅法可通过下⾯的代码具体了解。
#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查找成功在上⾯的代码中,我们成功地通过⼆分査找算法实现了查找功能,其实现过程如下图所⽰。