一.顺序查找法
顺序查找是一种最简单的线性查找方法。其基本思想是:从表的一端开始,顺序扫描线性表,依次将扫描到的关键字和给定值k相比较,若当前扫描到的关键字与k相等,则查找成功;若扫描结束后,仍未找到关键字等于k的记录,则查找失败。
顺序查找是最基本的查找算法。
顺序查找的基本代码如下:
#include <stdio.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int k = 0; scanf("%d", &k); int sz = sizeof(arr) / sizeof(arr[0]); int i = 0; for (i = 0; i < sz; i++)//一个一个穷举 { if (arr[i] == k) { printf("找到了,下标是%d\n", i); break; } } if (i == sz) printf("找不到此数字"); return 0; }
由此可见,顺序查找的效率十分低下,这只是10个数字,倘若有十万千万个,这个程序就会变得十分的繁琐。
所以我接下来要介绍另一种查找算法——二分算法
这张图就很好地表现了顺序查找和二分查找的区别,以及二分查找的简便性。
废话不多说,接下来就让我介绍二分查找吧。
二.二分查找法
二分查找,也称为折半查找。在使用二分查找时,我们需要一个升序的数组,否则就会出现错误。
就跟小朋友排队一样,如果不按身高顺序从矮到高的话,每次折半找小朋友的时候就会忽略一些没有按顺序站好的小朋友,也许要找的小朋友就在你折去的一半里面,这样就没办法找到你想要的小朋友了。
所以一定一定要注意我们查找中的数组一定要是一个升序的数组,若不是升序,我们可以先将数组排序,再进行查找。
有关排序的算法在这里不多作介绍,大家可以自行查阅资料,或者过段时间在我的主页查找也可以。
二分查找的过程如下:
1.确定被查找的范围
2.确定被查找范围的左右下标
3.根据左右元素的下标确定中间元素的下标
4.找到中间元素和要找的元素比较
a.找到,结束
b.未找到,重新回到第一步,找范围
以下是一个简单的寻找7的过程介绍:
在这个地方(0+9)/2=4,下标为4时数组中的数为5,因为5<7,所以我们这时要将左下标换为4+1=5,再重新比较。这个地方有一个+1是因为不+1的情况我们已经比较过了,所以在此基础上+1。
即:
这个时候left=4,right=9,mid=(4+9)/2=6,这是下标为6的数恰好为7,将7与我们需要的数作比较,这样我们就找到了想要的数字。不用再继续向下运行了。
以上只是一个简单的情况,不过再往后也是上述过程的循环,所以,只要弄清楚了基本原理,二分查找还是很简单的。
接下来是这个程序的代码实现:
#include<stdio.h> int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//已知的整形有序数组 int a = 0;//x是要寻找的数 int left = 0;//左下标 int right = sizeof(arr) / sizeof(arr[0]) - 1;//数组右下标 scanf("%d", &a); while (left <= right) { int mid = left+(right-left)/2;//找到最中间的数 if (a < arr[mid]) { right = mid-1; } else if (a > arr[mid]) { left = mid+1; } else { printf("找到了,下标是%d\n", mid); break; } } if (right < left) { printf("没找到"); } return 0; }
在这个里面,我将二分查找的部分写为了函数,也是为了方便多次运用二分查找。
所以有需要多次使用的部分大家可以将其写为函数方便自己的使用。