C语言:使用 普通方法 和 二分查找算法(折半查找算法) 在一个有序数组中查找具体的某个数字n

题目:

从键盘输入数字n,在一个 有序数组 中查找具体的某个数字n。

                    

 =========================================================================

                       

思路一:普通方法

(逻辑简单,在无序数组中也可以使用,但效率较低,需要逐个查找)

总体思路:

(一). 设置初始数组,生成相关变量

               

(二). 使用for循环数组中进行逐个查找

for循环 中使用 if条件判断语句 判断n是否在数组中

        找到使用 break 跳出循环打印相应信息

                   

(三). 未找到跳出 for循环 后,再使用 if语句 判断是否已遍历完了数组

未找到 n 且已遍历完数组打印相应信息

                


              

第一步:

(1). 设置初始数组int arr[];

                     

(2). 生成相关变量

int n = 0; -- 存放从键盘输入的要查找的值

int i = 0; -- 循环变量

                  

(3). 实现输入数据获取数据 -- scanf()函数

                     

实现代码:

//思路一:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量

	//输入数据和获取数据:
	scanf("%d", &n);


	return 0;
}

实现图片:

                 


                 

第二步:

(1). 编写for循环循环遍历数组中的元素

              

(2). 编写for循环中的if条件判断语句

判断数组遍历的元素是否和输入的n一致一致则打印相应信息后提前break跳出循环

                     

实现代码:

//思路一:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量

	//输入数据和获取数据:
	scanf("%d", &n);

	//编写for循环:循环遍历数组中的元素
	for (i = 0; i < 10; i++)
	{
		//编写for循环中的if条件判断语句:
		if (arr[i] == n)
			//循环判断数组遍历的元素是否和n相同
		{
			printf("找到了,该值在数组中对应的下标是:%d\n", i);
			break;
			//相同则打印相应信息后break跳出循环
		}
	}

	return 0;
}

实现图片:

                 


                 

第三步:

如果for循环遍历数组元素后都没有找到n的话,

再使用一个if条件判断语句,判断是否已遍历完了数组元素

已遍历完数组且没有找到n打印对应信息

                     

实现代码:

//思路一:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量

	//输入数据和获取数据:
	scanf("%d", &n);

	//编写for循环:循环遍历数组中的元素
	for (i = 0; i < 10; i++)
	{
		//编写for循环中的if条件判断语句:
		if (arr[i] == n)
			//循环判断数组遍历的元素是否和n相同
		{
			printf("找到了,该值在数组中对应的下标是:%d\n", i);
			break;
			//相同则打印相应信息后break跳出循环
		}
	}

	//如果for循环遍历数组元素后都没有找到n的话:
	//再使用一个if条件判断语句,判断是否已遍历完了数组元素,
	//已遍历完数组且没有找到n,打印对应信息。
	if (i == 10) //10超过了数组下标,说明数组中没有这个值
	{
		printf("数组中没有该值。\n");
	}

	return 0;
}

实现图片:

                    

思路一:最终代码和实现效果

最终代码:

//思路一:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量

	//输入数据和获取数据:
	scanf("%d", &n);

	//编写for循环:循环遍历数组中的元素
	for (i = 0; i < 10; i++)
	{
		//编写for循环中的if条件判断语句:
		if (arr[i] == n)
			//循环判断数组遍历的元素是否和n相同
		{
			printf("找到了,该值在数组中对应的下标是:%d\n", i);
			break;
			//相同则打印相应信息后break跳出循环
		}
	}

	//如果for循环遍历数组元素后都没有找到n的话:
	//再使用一个if条件判断语句,判断是否已遍历完了数组元素,
	//已遍历完数组且没有找到n,打印对应信息。
	if (i == 10) //10超过了数组下标,说明数组中没有这个值
	{
		printf("数组中没有该值。\n");
	}

	return 0;
}

实现效果:

                    

 =========================================================================

                       

思路二:二分查找算法(折半查找算法)-- 重点!

(在有序数组查找中效率更高,一次查找就能排除一半的值)

总体思路:

                


                

第一步:

(1). 设置初始数组int arr[]

            

(2). 生成相关变量

int n = 0; -- 存放从键盘输入的要查找的值

int i = 0; -- 循环变量

int sz = sizeof(arr) / sizeof(arr[0]) -- 数组元素个数。

             

(3). 实现输入数据获取数据 -- scanf()函数

                     

实现代码:

//思路二:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序(有序数组)
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量
	int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数
	//sizeof(arr):计算数组总大小(单位是字节)
	//sizeof(arr[0]):计算数组中单个元素大小
	//用 sizeof(arr) / sizeof(arr[0]) :总大小 除以 单个元素大小 == 元素个数

	//输入数据和获取数据:
	scanf("%d", &n);

	return 0;
}

实现图片:

                  


                 

第二步:

(1). 创建 左下标left 右下标right

           

(2). 设置一个 变量flag,用来设置未找到情况下的处理方式

                     

实现代码:

//思路二:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序(有序数组)
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量
	int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数
	//sizeof(arr):计算数组总大小(单位是字节)
	//sizeof(arr[0]):计算数组中单个元素大小
	//用 sizeof(arr) / sizeof(arr[0]) :总大小 除以 单个元素大小 == 元素个数

	//输入数据和获取数据:
	scanf("%d", &n);

	//创建 左下标 和 右下标:
	int left = 0; //数组第一个下标是0,左下标
	int right = sz - 1;//数组从0开始,用 元素个数-1 得右下标

	//设置一个flag:
	int flag = 0; //用来设置未找到情况下的处理方式

	return 0;
}

实现图片:

                 


                 

第三步:

(1). 使用while循环结合左右下标进行循环查找

             

(2). 确定 中间下标mid

                     

实现代码:

//思路二:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序(有序数组)
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量
	int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数
	//sizeof(arr):计算数组总大小(单位是字节)
	//sizeof(arr[0]):计算数组中单个元素大小
	//用 sizeof(arr) / sizeof(arr[0]) :总大小 除以 单个元素大小 == 元素个数

	//输入数据和获取数据:
	scanf("%d", &n);

	//创建 左下标 和 右下标:
	int left = 0; //数组第一个下标是0,左下标
	int right = sz - 1;//数组从0开始,用 元素个数-1 得右下标

	//设置一个flag:
	int flag = 0; //用来设置未找到情况下的处理方式

	//使用while循环结合左右下标进行循环查找:
	while (left <= right)
		//left <= right:说明被左右下标包裹的数组还有值,还有值继续循环判断
	{
		//确定中间下标mid:
		int mid = (left + right) / 2;

		//进行查找:

	}

	return 0;
}

实现图片:

                 


                 

第四步:

(1). 循环中找到对应元素的情况处理

               

(2). 循环中未找到对应元素的情况处理

                     

实现代码:

//思路二:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序(有序数组)
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量
	int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数
	//sizeof(arr):计算数组总大小(单位是字节)
	//sizeof(arr[0]):计算数组中单个元素大小
	//用 sizeof(arr) / sizeof(arr[0]) :总大小 除以 单个元素大小 == 元素个数

	//输入数据和获取数据:
	scanf("%d", &n);

	//创建 左下标 和 右下标:
	int left = 0; //数组第一个下标是0,左下标
	int right = sz - 1;//数组从0开始,用 元素个数-1 得右下标

	//设置一个flag:
	int flag = 0; //用来设置未找到情况下的处理方式

	//使用while循环结合左右下标进行循环查找:
	while (left <= right)
		//left <= right:说明被左右下标包裹的数组还有值,还有值继续循环判断
	{
		//确定中间下标mid:
		int mid = (left + right) / 2;

		//进行查找:
		//(1).循环中找到对应元素的情况处理:
		if (arr[mid] == n)
		{
			printf("找到了,该值在数组中对应的下标是:%d\n", mid);
			flag = 1; //找到就把flag设为1,说明找到了
			break; //找到就break跳出循环
		}
		//(2).循环中未找到对应元素的情况处理:
		else if (arr[mid] < n) 
			//中间值小于要找的值,排除mid和小于mid左边的值
		{
			left = mid + 1; 
			//因为mid左边(包括mid)都舍弃了,所以 mid+1 刚好就是新的左下标
		}
		else
			//中间值大于要找的值,排除mid和大于mid右边的值
		{
			right = mid - 1;
			//因为mid右边(包括mid)都舍弃了,所以 mid-1 刚好就是新的右下标
		}
	}

	return 0;
}

实现图片:

                 


                 

第五步:

退出循环,说明没有找到对应元素

看flag的值,打印相应的情况。

                     

实现代码:

//思路二:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序(有序数组)
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量
	int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数
	//sizeof(arr):计算数组总大小(单位是字节)
	//sizeof(arr[0]):计算数组中单个元素大小
	//用 sizeof(arr) / sizeof(arr[0]) :总大小 除以 单个元素大小 == 元素个数

	//输入数据和获取数据:
	scanf("%d", &n);

	//创建 左下标 和 右下标:
	int left = 0; //数组第一个下标是0,左下标
	int right = sz - 1;//数组从0开始,用 元素个数-1 得右下标

	//设置一个flag:
	int flag = 0; //用来设置未找到情况下的处理方式

	//使用while循环结合左右下标进行循环查找:
	while (left <= right)
		//left <= right:说明被左右下标包裹的数组还有值,还有值继续循环判断
	{
		//确定中间下标mid:
		int mid = (left + right) / 2;

		//进行查找:
		//(1).循环中找到对应元素的情况处理:
		if (arr[mid] == n)
		{
			printf("找到了,该值在数组中对应的下标是:%d\n", mid);
			flag = 1; //找到就把flag设为1,说明找到了
			break; //找到就break跳出循环
		}
		//(2).循环中未找到对应元素的情况处理:
		else if (arr[mid] < n) 
			//中间值小于要找的值,排除mid和小于mid左边的值
		{
			left = mid + 1; 
			//因为mid左边(包括mid)都舍弃了,所以 mid+1 刚好就是新的左下标
		}
		else
			//中间值大于要找的值,排除mid和大于mid右边的值
		{
			right = mid - 1;
			//因为mid右边(包括mid)都舍弃了,所以 mid-1 刚好就是新的右下标
		}
	}

	//退出循环,说明没有找到对应元素
	if (flag == 0)
	{
		printf("没找到\n");
	}

	return 0;
}

实现图片:

                    

思路二:最终代码和实现效果

最终代码:

//思路二:
#include <stdio.h>
int main()
{
	//设置初始数组:
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序(有序数组)
	//数组下标:   0 1 2 3 4 5 6 7 8 9

	int n = 0; //获取从键盘输入的要查找的值
	int i = 0; //循环变量
	int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数
	//sizeof(arr):计算数组总大小(单位是字节)
	//sizeof(arr[0]):计算数组中单个元素大小
	//用 sizeof(arr) / sizeof(arr[0]) :总大小 除以 单个元素大小 == 元素个数

	//输入数据和获取数据:
	scanf("%d", &n);

	//创建 左下标 和 右下标:
	int left = 0; //数组第一个下标是0,左下标
	int right = sz - 1;//数组从0开始,用 元素个数-1 得右下标

	//设置一个flag:
	int flag = 0; //用来设置未找到情况下的处理方式

	//使用while循环结合左右下标进行循环查找:
	while (left <= right)
		//left <= right:说明被左右下标包裹的数组还有值,还有值继续循环判断
	{
		//确定中间下标mid:
		int mid = (left + right) / 2;

		//进行查找:
		//(1).循环中找到对应元素的情况处理:
		if (arr[mid] == n)
		{
			printf("找到了,该值在数组中对应的下标是:%d\n", mid);
			flag = 1; //找到就把flag设为1,说明找到了
			break; //找到就break跳出循环
		}
		//(2).循环中未找到对应元素的情况处理:
		else if (arr[mid] < n) 
			//中间值小于要找的值,排除mid和小于mid左边的值
		{
			left = mid + 1; 
			//因为mid左边(包括mid)都舍弃了,所以 mid+1 刚好就是新的左下标
		}
		else
			//中间值大于要找的值,排除mid和大于mid右边的值
		{
			right = mid - 1;
			//因为mid右边(包括mid)都舍弃了,所以 mid-1 刚好就是新的右下标
		}
	}

	//退出循环,说明没有找到对应元素
	if (flag == 0)
	{
		printf("没找到\n");
	}

	return 0;
}

实现效果:

  • 18
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
好的,以下是一个简单的 C 语言程序,用于实现对有序数组折半查找算法: ```c #include <stdio.h> // 二分查找函数 int binarySearch(int arr[], int len, int target) { int left = 0; // 左侧边界 int right = len - 1; // 右侧边界 while (left <= right) { int mid = (left + right) / 2; // 间位置 if (arr[mid] == target) { return mid; // 找到目标元素,返回下标 } else if (arr[mid] < target) { left = mid + 1; // 目标元素在右半部分,缩小左侧边界 } else { right = mid - 1; // 目标元素在左半部分,缩小右侧边界 } } return -1; // 未找到目标元素,返回 -1 } int main() { int arr[10] = {2, 5, 8, 10, 15, 20, 25, 30, 35, 40}; // 假设要查找的数组为 arr,数组长度为 10 int target = 15; // 假设要查找的目标元素为 15 // 二分查找 int index = binarySearch(arr, 10, target); // 输出查找结果 if (index != -1) { printf("找到了目标元素 %d,它在数组中的下标为 %d。\n", target, index); } else { printf("未找到目标元素 %d。\n", target); } return 0; } ``` 程序,我们定义了一个长度为 10 的有序数组 arr,以及要查找的目标元素 target。然后,调用 binarySearch() 函数进行二分查找。函数使用 left 和 right 变量分别记录左侧和右侧边界,然后不断缩小边界范围,直到找到目标元素或者边界重合。最后,根据函数返回值输出查找结果。 注意:这只是一个简单的实现,实际应用可能需要考虑多种情况和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高高的胖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值