9.2 线性查找(顺序查找)

本文探讨了线性查找法的概念及其在数据结构与算法分析中的应用。通过对比未改进与改进的线性查找法,展示了改进方法如何显著提高查找速度。详细介绍了改进方法的具体实现和操作流程,并通过实例演示了查找过程及效率提升效果。

线性查找法(LinearSearching)又称为循序式查找(SequentialSearching).

是从数据中的第一笔数据开始查找比较,如果找到则返回该值或该位置,如果没有找到则往下一步数据查找比较,直到找到最后一笔数据为止。


1、未改进LinearSerach情况下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/***********************************************************/
// 程序名称:LinearSearch.cpp
// 程序目的:设计一个线性查找的程序
// 程序来源:数据结构与算法分析(C语言描述) P-277
// 日期:2013-8-27 19:57:22   JohnnyHu改进
/***********************************************************/

#include <stdio.h>
#include <stdlib.h>

int data[20] = {1276292215,
                6229583567,
                5833288990,
                2864482077 }; // 数据数组

// 顺序查找
bool LinearSerach(int& key, int& counter)
{
    int index = 0;      // 计数变量
    counter = 0;        // 查找次数

    while (index < 20)
    {
        counter++;
        if (key == data[index])
        {
            printf("data[%d] = %d \n", index, key);
            return true;
        }
        index++;
    }

    return false;
}

// 主程序 
int main(void)
{
    int keyValue;
    printf("请输入您要查找的(int)值,输入0退出: ");
    while(scanf("%d", &keyValue))
    {
        if (0 == keyValue)
            break;

        int counter= 0;
        if (LinearSerach(keyValue, counter))
            printf("查找次数为: %d\n", counter); // 输出查找次数
        else
            printf("查找的值没有发现!\n");

        printf("请输入您要查找的(int)值,输入0退出: ");
    }

    return 0;
}
输出结果:


2、改进的LinearSerach函数,改进的线性查找法可以大幅度提高查找速度。

具体做法:将欲查找的数据放在最后一笔数据之后或者执行,并记录其存储位置,这样我们就不用这样每次都while (index < 20)判断数组已到达边界。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/***********************************************************/
// 程序名称:SearchTree.cpp
// 程序目的:设计一个线性查找的程序
// 程序来源:数据结构与算法分析(C语言描述) P-277
// 日期:2013-8-27 19:57:22   JohnnyHu改进
/***********************************************************/

#include <stdio.h>
#include <stdlib.h>

#define  MAX   20          

int data[MAX+1] = {1276292215,
                6229583567,
                5833288990,
                2864482077 }; // 数据数组

// 顺序查找
bool LinearSerach(int& key, int& counter)
{
    int index = 0;      // 计数变量
    counter = 0;        // 查找次数

    while (true)
    {
        counter++;
        if (key == data[index])
        {
            if (index != MAX)
            {
                printf("data[%d] = %d \n", index, key);
                return true;
            }
            else
                break;
        }
        index++;
    }

    return false;
}

// 主程序 
int main(void)
{
    int keyValue;
    printf("请输入您要查找的(int)值,输入0退出: ");
    while(scanf("%d", &keyValue))
    {
        data[MAX] = keyValue;   // 将欲查找的数据存放在最后一笔数据后
        if (0 == keyValue)
            break;

        int counter= 0;
        if (LinearSerach(keyValue, counter))
            printf("查找次数为: %d\n", counter); // 输出查找次数
        else
            printf("查找的值没有发现!\n");

        printf("请输入您要查找的(int)值,输入0退出: ");
    }

    return 0;
}

背景为黄色的部分标注的是变化的部分!

输出结果同上,但查询速度整体会提升。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值