查找算法是计算机中常用的一个算法,它的主要目的是从线性表的众多数据项中找到特定的数据项。查找算法有很多种,我们这里只介绍较为简单的两种算法,顺序查找和二分法查找。
1.顺序查找
其思路描述为:从第一个数据项开始查找,逐个比较和要查询的数据项是否一致,若一次,则查询成功,找到了所要查询的数据项;若直到最后的一个数据项,也没有一致的,则查询失败,即没有找到所有查询的数据项。
顺序查找算法的性能分析:时间复杂度,在顺序查找中,我们以数据项的比较作为基本操作,所以比较次数就是时间复杂度的体现。
- 最好的情况下,要查找的数据项在第一个位置,我们只需比较一次,就可以查找成功。
- 最坏的情况下,要查找的数据项在最后一个位置或根本不存在,此时我们需要比较N次,才可以查找成功或查找不成功。
综合考虑,顺序查找平均查找次数在n/2左右,其时间复杂度为O(n)。顺序查找举例阐述如下:
图2.2.35 顺序查询示例
假设有一个线性表如图2.2.31所示,我们需要查找数据项12。则根据顺序查找算法,首先是拿12和序列中的第一个数据项23比较,发现不相等,则继续和第二个数据项16比较,仍然不相等,则继续和第三个数据项78比较,知道比较到第四个数据项,发现相等,则在该序列中找到了12。
顺序查询算法使用的场景:
- 如果线性表是无序的,则无论它顺序存储还是链式存储,都只能使用顺序查找;
- 如果线性表是有序的,但它使用了链式存储,则也只能使用顺序查找;
2.二分法查找
其思路描述为:先将要查询的数据项与中间位置的数据项进行比较,如果等于,则查找成功;如果小于,则表明要查找的数据项在前半部分,如果大于,则表明要查找的数据项在后半部分,此时将要查找的数据项与前半部分或后半部分的中间位置数据项进行比较,依次类推,一直和剩余部分的中间位置数据项进行比较,直至查找成功或查找不成功。我们举例阐述如下:
图2.2.36 二分法查询示例
假设有一个线性表如图2.2.32所示,我们需要查找数据项12。则根据二分法查找算法,我们需要首先拿12和该线性表中间位置的数据项进行比较,即第4个位置的数据项23比较,发现12小于23,则判断12应该在该数据项的前半部分,如图2.2.33所示。所以我们拿12继续和前半部分组成的子线性表的中间位置数据项比较,即和第二个位置的12比较,发现一致,则查找成功。
图2.2.37 前半部分组成的子线性表
由以上描述可知,要想使用二分法查找,则线性表的排列必须是有序的,即从小到大排序(如上面算法描述的),或者从大到小排序。
二分法算法的时间复杂度为O(log2n),推算过程(略)。