二分查找算法C语言源程序代码

合集下载

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语言

二分查找 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语言中的搜索算法详解搜索算法在计算机科学中起着重要的作用,它们可以帮助我们在大量数据中迅速找到目标元素。

在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语言实现二分查找

实验课题:【用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基础算法之二分法查找

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语言二分查找算法,折半查找算法

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;。

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