C语言编程中的线性搜索
目录
搜索算法基本上被认为是计算机科学中的一个重要阶段,它包括使用一个逐步的程序,在一大批数据中找到一个特定的数据。
为了完成这个程序,所有的搜索算法都利用一个搜索键。
计算机科学中有不同类型的搜索算法,如何采用这些算法决定了提供数据的性能和效率(数据的使用方式)。
这些算法根据其执行的搜索操作的类型分为两组。
- 顺序搜索。这种方法连续地遍历列表或数组,检查每个元素。(与线性搜索的情况相同)。
- 间隔搜索。这些算法是以搜索排序的数据结构为目标而创建的。这些类型的搜索算法比线性搜索更有效,因为它们不断地以搜索结构的中心为目标,将搜索空间分成两半。例子。二进制搜索。
搜索算法的类型
- 线性搜索
- 二进制搜索
- 跳跃搜索
- 插值搜索
- 指数搜索
- 子列表搜索(在另一个列表内搜索一个链接列表)
- 斐波那契搜索
- 无所不在的二进制搜索
线性搜索
线性搜索,也被称为顺序搜索,是一个在一个项目列表中寻找一个项目的过程。这种搜索算法逐一检查列表中的每个元素,直到找到一个匹配的元素或搜索完整个列表。
在最坏的情况下,线性搜索需要线性时间,最多进行n次比较,其中n是列表的长度。
如果每个元素被搜索的机会相同,线性搜索的平均情况是n+1/2次比较,但是如果每个元素的搜索概率不同,平均情况会受到影响。线性搜索很少是可行的,因为其他搜索算法和方案(如二进制搜索算法和哈希表)为所有列表提供了明显更快的搜索操作。
以下是实现线性搜索的步骤。
- 我们首先必须使用一个for循环来遍历数组元素。
- 在搜索元素列表中的一个元素的过程中,我们应该在循环的每次迭代中,首先将搜索元素与当前的元素列表进行比较,如果元素匹配,则返回相关数组元素的索引。
- 如果我们要找的元素不匹配,就继续找下一个。
如果没有匹配或者在给定的数组中没有找到搜索元素,则返回-1。
什么是C语言编程中的线性搜索?
在C语言中,我们执行线性搜索来查看一个数字是否存在于一个数组中。它也被称为顺序搜索,其中我们将每个元素与我们正在寻找的元素进行比较,直到我们找到它或当列表耗尽时。
线性搜索的算法(Approach)
搜索是在一个项目的列表中找到某个项目的方法。如果在列表中找到该元素,则认为该过程是成功的,并返回该元素的位置;否则,则认为搜索是不成功的。
在线性搜索中,要找到指定数组中的索引或搜索位置。它通过比较搜索键和数组/第一个列表的元素开始搜索。如果第一个元素与搜索键不匹配,将比较下一个元素,以此类推,直到发现匹配或数组结束。如果发现匹配,则返回索引;否则,则到达数组或列表的末端,表明搜索键不可用。
为了更好地理解线性搜索,我们将看到一个例子。
例子。
给定数组={50, 90, 30, 70, 60}。
假设搜索键是30。接下来,扫描数组,将每个元素与搜索关键词进行比较。数组的第一个元素是50,但是50不等于30,因此继续到下一个元素。下一个元素是90,但是它不等于30,所以继续下一个元素。数组的下一个元素是30,这与搜索键30相同,因此返回数组当前元素的索引。
上面的例子是搜索键存在于数组中的情况。现在考虑一个搜索键不存在的情况。让我们假设搜索键等于10。将数组中的每个元素与搜索元素进行比较。它与50、90、30、70、60匹配失败,最终达到数组的结论。结果,返回-1或打印元素不存在于数组中,表明搜索键不可用。
实现线性搜索的C语言程序
以下是C程序中线性搜索的代码。
#include <stdio.h> void main() { int num; int i, key, element_found = 0; printf("Enter number of elements you would like to take as input: " ); scanf("%d", &num)。 int arr[num]; printf("\nEnter all the elements of your choice:")。 for (i = 0; i < num; i++) { scanf("%d", &arr[i])。 } printf("\nEnter the key element that you would like to be searched: " )。 scanf("%d", &key); /* 线性搜索开始 */ for (i = 0; i < num ; i++) { 如果(key == arr[i] ) { element_found = 1。 break; } } 如果(element_found == 1) printf("我们在索引%d处找到了元素",i+1)。 否则 printf("我们没有在数组的任何索引上找到元素/n")。 } |
输出。
代码的解释。
- 在线性搜索中,我们通过从头到尾遍历数组来寻找一个元素或值,直到发现所需的元素或值。
- 数组被逐步搜索,如果要搜索的关键元素在数组中被找到,则返回该位置;否则,返回-1。
- 在这个C语言程序中,我们没有特别为线性搜索创建一个函数;相反,我们可以在主函数中检查数组中是否存在一个元素。
- 我们从第0个索引开始遍历数组,并按索引顺序递增,在那里中断循环,并打印出元素在数组中的位置,但如果要求的元素不存在于数组中,我们就简单地显示 "元素不存在于数组中"。
- 如果我们写了一个单独的线性搜索函数,并且在数组中找不到该元素,我们会返回-1或者打印 "元素不在数组中",表明该元素不存在。
多次出现的线性搜索
下面的代码会打印出所有可以找到所需元素的位置,以及它在程序列表中出现的次数。
#include <stdio.h> int main() { int arr[100], key, i, no, count = 0, search; printf("Enter number of elements you would like to take as input/n")。 scanf("%d", &no)。 printf("输入%d个数字/n", no)。 for (i= 0; i < no; i++) scanf("%d", &arr[i]); printf("输入一个你想搜索的数字/n")。 scanf("%d", &search)。 for (i = 0; i < no; i++) { if (arr[i] == search) { printf("%d在位置%d.\n", search, i+1)。 count++; } } 如果(count == 0) printf("%d key is not present in the array.\n", search); 否则 printf("%d is present %d times in the array.\n", search, count); 返回0。 } |
输出。
使用函数进行线性搜索
下面是在C语言程序中使用函数实现线性搜索的代码。
#include<stdio.h>: #include<stdio.h>. int linear_search_function(int a[], int n, int key) { for (long i = 0 ;i < n; i++ ) { 如果(a[i] == key) 返回i。 } 返回-1。 } int main() { int arr[100], key, k, n, key_position; printf("Enter number of elements in the array/n"); scanf("%d", &n); printf("Enter %d integer(s)\n", n); for (k= 0; k < n; k++) scanf("%d", &arr[k])。 printf("输入一个你想在数组中搜索的数字/n")。 scanf("%d", &key); key_position = linear_search_function(arr, n, key); 如果(key_position == -1) printf("%d不存在于数组中。\n", key)。 否则 printf("%d存在于位置%d./n", key, key_position+1)。 返回0。 } |
输出。
在C语言中使用递归进行线性搜索
递归函数是一个包含对自身调用的函数。递归是定义递归函数的一种方法。它允许我们将一个大问题分解成容易管理的单一基本情况。分割和征服也是一种力量,是一种流行的计算机编程策略,被广泛用于编程。
#include <stdio.h> int linear_search_with_recursion(int arr[], int value, int index, int n) { int position = 0。 if(index >= n) { 返回0。 } 否则如果(arr[index] == value) { position = index + 1; 返回位置。 } 否则 { return linear_search_with_recursion(arr, value, index+1, n); } 返回位置。 } int main() { int n, value, position, m = 0, arr[100]; printf("输入你想取的数组中的总元素:")。 scanf("%d", &n); printf("输入数组中的元素:/n")。 for (int i = 0; i < n; i++) { scanf("%d", &arr[i])。 } printf("输入你想在数组中搜索的元素:")。 scanf("%d", &value); position = linear_search_with_recursion(arr, value, 0, n)。 如果(position != 0) { printf("在位置%d发现元素", position); } 否则 { printf("在数组中没有找到元素")。 } 返回0。 } |
输出。
代码解释。
- 在线性搜索中,我们通过从头开始遍历数组,在数组中寻找一个元素或值,直到发现我们想要的元素或值。
- 数组被逐步搜索,如果要搜索的关键元素在数组中被找到,就会返回该位置;否则,就会打印出 "在数组中没有找到元素"。
- 在这个C语言程序中,我们写了一个递归函数,叫做linear_search_with_recursion(),它接受四个输入参数,并返回用户正在搜索的数组中的一个元素的位置。
- 如果找到了第一个元素,就会立即返回索引。
- 如果它不是数组中的第一个成员,我们通过删除第一个元素来减少数组的大小,这意味着在第二次调用Linear Search-with_recursion()时,数组的大小将被减少1(n-1)。这将一直持续到元素被发现为止。
C程序中线性搜索的时间复杂度
一个算法的时间复杂度无非是它作为一个算法对整个输入进行运行所需的时间量。算法所要执行的操作数量由输入的长度来表示。在这种情况下,它不会考虑算法的整体执行时间。相反,当算法中的操作数增加或减少时,它将提供执行时间的变化(增加或减少)的数据。
让我们来看看线性搜索在最佳、平均和最差情况下的复杂度。
情况 | 时间复杂度 |
最佳情况 | O(1) |
平均情况 | O(n) |
最差情况 | O(n) |
- 线性搜索中的最佳情况复杂度。在线性搜索中,当我们要找的元素在数组的顶部时,就会出现最佳情况。在最佳情况下,线性搜索的时间复杂度是O(1)。
- 平均情况复杂度:在线性搜索中,平均情况的时间复杂度是O(n)。
- 最坏情况下的复杂度。在线性搜索中,最坏的情况发生在我们要寻找的元素位于数组的末端时。当目标元素不存在于指定的数组中时,最坏的情况是我们必须遍历整个数组。在最坏情况下,线性搜索的时间复杂度是O(n)。
因为数组中的每个成员只被比较一次,所以线性搜索的时间复杂性为O(n)。
C程序中线性搜索的空间复杂度
根据其输入大小,空间复杂度本质上是对算法或操作所需的总内存量的测量。它是算法为解决计算问题的特定实例所需的内存空间量,是输入特征的函数。
由于我们知道线性搜索中的额外数据量是固定的,空间复杂度总是O(1)。
结论
在C语言中,线性搜索涉及按顺序遍历一个列表或数组,看是否有一个条目。其目的是开始遍历数组,从第一个元素开始,一个一个地比较数组中的项目,直到发现一个匹配项或达到数组的终点。
我们希望这篇文章能帮助你获得关于线性搜索的C程序的知识。在这篇文章中,我们讨论了线性搜索的用途,时间和空间的复杂性,以及在代码中实现线性搜索的方法。我们还学习了如何在我们的软件开发项目中使用它。