折半查找
2021/5/21 18:29:54
本文主要是介绍折半查找,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一.题目要求
·题目
输入n(n<100)个有序正数,请用折半查找算法,查找x在其中的位置。
·测试
输入:5 1,2,3,4,5 2
输出:2
注:测试集合中,x数一定在正数数组中。即不用处理错误逻辑。
二.题目分析
- 输入的第一个数是数的个数,第二组数是一组有序的数,即不需要自己排序,第三个数则是要查找的数。
- 折半查找,也称二分查找,即利用二分法进行查找。在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。
三.代码实现
#include <stdio.h> int main() { int n, i; int series[100]; int t; int right, left, middle; //输入 scanf_s("%d", &n); for (i = 0; i < n; i++) { scanf_s("%d,", &series[i]); } scanf_s("%d", &t); //初始化 left = 0; right = n - 1; middle = (n - 1) / 2; //二分法查找 while (series[middle] != t) { if (series[middle] < t) right = middle; else left = middle; middle = (left + right) / 2; } printf("%d", middle); return 0; }
好吧,上面的代码还是运行不了(似曾相识)。
调试的时候发现数组元素的输入没有成功,但是没有找到错误的原因。
然后我在网上找到了小刘同学分享的代码。
点击跳转到:折半查找
#include <stdio.h> int main() { int num[100]; int a,b,flag,i=0; scanf("%d",&a); for(i=0;i<a;i++) { scanf("%d,",&num[i]); } scanf("%d",&b); int left=0,right=a-1; while(left<=right) { flag = (left+right)/2; if(b==num[flag]) { printf("%d",flag+1); break; } if(num[flag] > b) right = flag-1; else if(num[flag] < b) left = flag+1; } }
我对比了一下,除了二分查找的实现部分,前面的不TM是一样的吗。。。
大家来找找错误。
这篇关于折半查找的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-27消息中间件底层原理资料详解
- 2024-11-27RocketMQ底层原理资料详解:新手入门教程
- 2024-11-27MQ底层原理资料详解:新手入门教程
- 2024-11-27MQ项目开发资料入门教程
- 2024-11-27RocketMQ源码资料详解:新手入门教程
- 2024-11-27本地多文件上传简易教程
- 2024-11-26消息中间件源码剖析教程
- 2024-11-26JAVA语音识别项目资料的收集与应用
- 2024-11-26Java语音识别项目资料:入门级教程与实战指南
- 2024-11-26SpringAI:Java 开发的智能新利器