顺序表查找

一、查找概论

1、查找表:查找表是由同一类型的数据元素或记录构成的集合。

2、关键字:关键字是数据元素中某个数据项的值,又称为键值,用它可以标识一个数据元素。也可以标识一个记录的某个数据项(字段),称为关键码。若此关键字可以唯一标识一个记录,则称此关键字为主关键字,所以对于不同的记录,其主关键字是不相同的。主关键字所在的数据项称为主关键码。而对于可以识别多个数据元素(或记录)的关键字,称为次关键字,它对应的数据项就是次关键码。

3、查找:查找就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或记录。

4、查找表按照操作方式来分,通常可以分为两种:

  • 静态查找表:静态查找表就是只作查找操作的查找表
  • 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素等等就是动态查找表
5、查找结构
为了提高查找的效率,专门为查找操作设置数据结构,这种面向查找操作的数据结构称为查找结构。从逻辑上说,查找所基于的数据结构是集合,集合中的记录之间没有本质关系,但是为了提高查找的性能,可以改变数据元素之间的关系,在存储时将查找集合组织成表、树等结构。比如 对于静态查找表来说,可以用线性表结构来组织数据,这样就可以使用顺序查找算法;如果数据的组织方式是按照主关键字进行排序的,那么还可以使用折半查找等查找技术来提高查找的效率。而对于动态查找表来说,可以考虑使用二叉排序树的查找技术、散列表结构等来进行查找。下面就以最简单的查找技术——顺序表查找,来作为开始吧。
二、顺序表查找
1、顺序查找又叫线性查找,它的查找思路为:从表中第一个(或者最后一个)记录开始,逐个进行记录的关键字和给定值进行比较,若某个记录的关键字和给定值相等,则查找成功。如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所差的记录,查找失败。
2、顺序查找算法实现如下:
/**
 * 顺序查找算法,查找成功则返回在数组中的下标,否则返回0
 * @param data:数据元素所在数组,注意,这里存储数据元素是从数组下标1开始的
 * @param dataLength:数组有效元素个数
 * @param searchValue:待查找关键字
 */
int SequenceSearch(int *data, int dataLength, int searchValue)
{
    int i;
    for (i = 1; i <= dataLength; i++)
    {
        if (data[i] == searchValue)
        {
            return i;
        }
    }
    return 0;
}
这样实现的顺序查找并不完美,因为每次循环时都要对i是否越界进行判断,下面对它进行优化,如下:
/**
 * 优化后的顺序查找算法,查找成功则返回在数组中的下标,否则返回0
 * @param data:数据元素所在数组,注意,这里存储数据元素是从数组下标1开始的
 * @param dataLength:数组有效元素个数
 * @param searchValue:待查找关键字
 */
int OptSequenceSearch(int *data, int dataLength, int searchValue)
{
    int i = dataLength;
    data[0] = searchValue;
    while (data[i] != searchValue)
    {
        i--;
    }
    return i;
}
3、时间复杂度
对于这样的顺序查找算法来说,最好的情况就是在第一个查找位置就找到了,那么时间复杂度为O(1),最坏的情况就是最后一个查找位置才找到,所以时间复杂度为O(n),当查找不成功时,需要n+1次比较,时间复杂度为O(n),所以平均时间复杂度为还是O(n)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值