顺序查找和二分查找(折半查找)

一、顺序查找

1.思路

将需要查找的数按顺序一个一个地与数组中元素进行比较,相等说明找到了,否则没找到

2. C语言代码实现

#include<stdio.h>
int main()
{
    
    
	int a[10] = {
    
     1,5,6,4,9,2,3,8,7,10 },i,k,find;
		printf("请输入需要查找的数k:");
	scanf("%d", &k);
	find = 0;//用find的值来判断该数有没有找到
	for (i = 0; i < 10; i++)
	{
    
    
		if (a[i] == k)
		{
    
    
			printf("找到了:%d,是a[%d],第%d个数", k, i, i + 1);
			find = 1;
		}
	}
	if (find == 0)
		printf("没找到");
	return 0;
}
  • 运行结果:
    在这里插入图片描述

二、二分查找(折半查找)

1. 思路

已知一个有序数组,将需要查找的数和数组的中间元素进行比较,若该数大于(小于)中间元素,则该数在中间元素的右边(左边),那么只需要将该数与右边(左边)的中间的数进行比较,创建循环,直至需要查找的数等于中间的数,即已经找到了该数,否则没有找到。

2. C语言代码实现:

#include<stdio.h>
int main()
{
    
    
	int m, l, r,find,k;
	int a[10] = {
    
     1,2,3,4,5,6,7,8,9,10 };
	printf("请输入需要找的数k:");  
		scanf("%d",&k);
		l = 0; r =10- 1; find = 0;//l和r分别为最左边数下标和最右边数下标 用find的值来判断该数有没有找到
		do
		{
    
    
			m = (l+r)/2;//中间值下标
			if (k == a[m])
			{
    
    
				printf("找到了:%d,是a[%d],第%d个数", k,m,m+1);
				find = 1;
				break;
			}
		 else if (k > a[m])
			 l = m + 1;//范围缩小至最中间值的右边
		 else if (k < a[m])
			 r = m - 1;//范围缩小至最中间值的左边
		} while (l <= r);
		if(find==0)
		printf("没找到");
	return 0;
}
  • 运行结果:
    在这里插入图片描述

  • 需要多花点时间思考是跳出循环的条件:当范围不断缩小时,最左边数下标和最右边数下标可能会出现交叉,即最左边数下标大于最右边数下标,此时已经没有数可以查找了,就可以跳出循环了

3. C语言函数代码实现:

#include<stdio.h>
int main()
{
    
    
	int arr[] = {
    
     1,2,3,4,5,6,7,8,9,10 }, k=0;
	printf("请输入需要找的数k:");
	scanf("%d", &k);
	int sz = sizeof(arr) / sizeof(arr[0]);//数组元素个数
	int binary_search(int b[], int k, int sz);//函数声明
	int ret = binary_search(arr,k,sz);//调用函数并接收函数返回值
	if (ret == -1)
		printf("没找到");
	else
		 printf("找到了:%d,是a[%d],第%d个数",k,ret, ret+1);
	return 0;
}
int binary_search(int b[], int k, int sz)//函数定义
{
    
    
	int l = 0;
	int r = sz - 1;
	while (l <= r)
	{
    
    
		int m = (l + r) / 2;
		if (b[m] < k)
			l = m + 1;
		else if (b[m] > k)
			r = m - 1;
		else
			return m;//找到了返回m
	}
	return -1;//没找到返回-1
}
  • 运行结果:
    在这里插入图片描述
  • 使用函数的作用能在代码长的时候体现出来,使代码变得更简洁,容易阅读。需要注意的是,如果函数在主函数后面,在调用函数时要先声明函数

查找算法除了两种基本算法,即顺序查找和二分查找(折半查找)外,还有插值查找、斐波那契查找、树表查找、分块查找、哈希查找等

猜你喜欢

转载自blog.csdn.net/m0_74102736/article/details/130179859