c/c++常用算法(13) -- 基本查找算法

查找的概念


       查找表(SearchTable):相同类型的数据元素(对象)组成的集合,每个元素通常由若干数据项构成。

       关键字(Key,码):数据元素中某个(或几个)数据项的值,它可以标识一个数据元素。若关键字能唯一标识一个数据元素,则关键字称为主关键字;将能标识若干个数据元素的关键字称为次关键字


       查找/检索(Searching):根据给定的K值,在查找表中确定一个关键字等于给定值的记录或数据元素。

                查找表中存在满足条件的记录:查找成功;结果:所查到的记录信息或记录在查找表中的位置。

              查找表中不存在满足条件的记录:查找失败。


       查找有两种基本形式:静态查找和动态查找。

            静态查找(Static Search):在查找时只对数据元素进行查询或检索,查找表称为静态查找表。

            动态查找(Dynamic Search):在实施查找的同时,插入查找表中不存在的记录,或从查找表中删除已存在的某个记录,查找表称为动态查找表。

       查找的对象是查找表,采用何种查找方法,首先取决于查找表的组织。查找表是记录的集合,而集合中的元素之间是一种完全松散的关系,因此,查找表是一种非常灵活的数据结构可以用多种方式来存储


        根据存储结构的不同,查找方法可分为三大类:

              ① 顺序表和链表的查找:将给定的K值与查找表中记录的关键字逐个进行比较,找到要查找的记录;

              ② 散列表的查找:根据给定的K值直接访问找表,从而找到要查找的记录;

              ③ 索引查找表的查找:首先根据索引确定待查找记录所在的块,然后再从块中找到要查找的记录。

查找方法评价指标

       查找过程中主要操作是关键字的比较,查找过程中关键字的平均比较次数(平均查找长度ASLAverageSearchLength)作为衡量一个查找算法效率高低的标准。ASL定义为:



       其中:

              Pi:查找第i个记录的概率,不失一般性,认为查找每个记录的概率相等,即P1=P2=…=Pn=1/n ;

              Ci:查找第i个记录需要进行比较的次数。



一、静态查找


1.顺序查找


1.1  查找思想

       从表的一端开始逐个将记录的关键字和给定K值进行比较,若某个记录的关键字和给定K值相等,查找成功;否则,若扫描完整个表,仍然没有找到相应的记录,则查找失败。


1.2  示例:




1.3 实例代码:

#include <iostream>
#include <time.h>

#define N 15

int SearchFun(int a[],int n,int x)
{
    int i,f = -1;
    
    for (i = 0; i<n; i++)
    {
        if (x == a[i])
        {
            f = i;
            break;
        }
    }
    return f;
}



int main(int argc, const char * argv[])
{
    // std::cout << "Hello, World!\n";
    int x,n,i;
    int shuzu[N];
    
    srand(time(NULL));
    
    for (i = 0; i<N; i++)
    {
        shuzu[i] = rand() % 100;
    }
    
    for (i =0; i<N; i++)
    {
        printf("%d ",shuzu[i]);
    }
    printf("\n\n");
    
    printf("输入要查找的数:");
    scanf("%d",&x);
    
    n = SearchFun(shuzu, N, x);
    
    if (n < 0)
    {
        printf("没找到数据:%d\n",x);
    }
    else
    {
        printf("数据:%d 位于数组的第 %d 个元素处.\n",x,n+1);
    }
   
    return 0;
}

       运行结果:

        


2.  折半查找(Binary Search)


       折半查找又称为二分查找,是一种效率较高的查找方法。

       前提条件:查找表中的所有记录是按关键字有序(升序或降序) 。

       查找过程中,先确定待查找记录在表中的范围,然后逐步缩小范围( 每次将待查记录所在区间缩小一半),直到找到或找不到记录为止。


2.1  查找思想

       用Low、High和Mid表示待查找区间的下界、上界和中间位置指针,初值为Low=1,High=n。

          取中间位置Mid:Mid=ë(Low+High)/2û;

          比较中间位置记录的关键字与给定的K值:

              ① 相等:查找成功;

              ② 大于:待查记录在区间的前半段,修改上界指针:High=Mid-1,转

              ③ 小于:待查记录在区间的后半段,修改下界指针:Low=Mid+1,转

       直到越界(Low>High),查找失败。


2.2举例

       如图(a),(b)所示:






2.3 实例代码:

#include <iostream>
#include <time.h>

#define N 15

void QuickSort(int *arr,int left,int right)     //快速排序算法
{
    int f,t;
    int rtemp,ltemp;
    
    ltemp = left;
    rtemp = right;
    f = arr[(left + right)/2];                  //确定分界值
    while (ltemp < rtemp)
    {
        while (arr[ltemp] < f)
        {
            ++ltemp;
        }
        
        while (arr[rtemp] > f)
        {
            --rtemp;
        }
        
        if (ltemp <= rtemp)
        {
            t = arr[ltemp];
            arr[ltemp] = arr[rtemp];
            arr[rtemp] = t;
            --rtemp;
            ++ltemp;
        }
    }
    
    if (ltemp == rtemp)
    {
        ltemp++;
    }
    
    if (left < rtemp)
    {
        QuickSort(arr, left, ltemp-1);
    }
    
    if (left < rtemp)
    {
        QuickSort(arr, rtemp+1, right);
    }
    
}

int SearchFun(int a[],int n,int x)              //折半查找
{
    int mid,low,high;
    low = 0;
    high = n - 1;
    while (low <= high)
    {
        mid = (low + high)/2;
        if (a[mid] == x)
            return mid;
        
        else if(a[mid] > x)
            high = mid -1;
        
        else
            low = mid + 1;
    }
    
    return -1;
}

int main(int argc, const char * argv[])
{
    // std::cout << "Hello, World!\n";
    int x,n,i;
    int shuzu[N];
    
    srand(time(NULL));
    
    printf("折半查找算法演示!\n");
    printf("排序前:\n");
    
    for (i = 0; i<N; i++)
    {
        shuzu[i] = rand() % 100;
    }
    
    for (i =0; i<N; i++)
    {
        printf("%d ",shuzu[i]);
    }
    printf("\n\n");
    
    
    QuickSort(shuzu, 0, N-1);
    printf("排序后:\n");
    
    for (i =0; i<N; i++)
    {
        printf("%d ",shuzu[i]);
    }
    printf("\n\n");

    printf("输入要查找的数:");
    scanf("%d",&x);
    
    n = SearchFun(shuzu, N, x);
    
    if (n < 0)
    {
        printf("没找到数据:%d\n",x);
    }
    else
    {
        printf("数据:%d 位于数组的第 %d 个元素处.\n",x,n+1);
    }
   
    return 0;
}

运行结果:

       


二、动态查找


动态查找可参考 

c/c++常用算法 -- 数据结构.


参考书籍:《C/C++常用算法手册》  《数据结构-清华大学严蔚敏》

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: C/C++算法常用手册是程序员日常工作中不可或缺的工具书之一。该手册主要收录了程序员在开发过程中常用算法,以及相应的代码实现。该手册涵盖了诸如数据结构、排序、查找、递归、贪心、动态规划、字符串等算法,帮助程序员快速掌握这些算法基本原理和实现方式。简单地说,该手册将算法的核心原理和实现细节集中在了一起,兼顾了易懂性和实用性。 随着程序员需求的不断增加,该手册逐渐扩充了更多的算法类型。同时,该手册还根据算法的不同应用场景进行分类,方便程序员快速查找和使用。例如,程序员可以通过该手册快速了解不同数据结构的原理和实现方,了解常见算法的时间复杂度和空间复杂度,还可以查找常见的实际问题中的算法实现方式。 总的来说,C/C++算法常用手册是程序员必备的工具之一,帮助程序员提高算法的实现能力和解决实际问题的能力,提高程序的效率和质量。 ### 回答2: C/C++常用算法手册是一本介绍计算机算法的参考手册,主要面向C/C++语言程序员。该手册总结了各种常用算法,包括排序、查找、图论、字符串等。通过该手册的学习,可以让程序员更好地掌握C/C++编程的技巧和方。 该手册中介绍了排序算法,包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。对于不同的排序算法,手册详细介绍了它们的思路和实现方,同时也对它们的时间复杂度和效率进行了分析和比较。 在查找方面,手册介绍了常用的顺序查找和二分查找算法,它们可以帮助程序员快速地定位和查找数据。 在图论和字符串方面,手册介绍了很多有用的算法,如最短路径算法、最小生成树算法、字符串匹配算法等。这些算法可以帮助程序员更好地解决实际问题。 总之,C/C++常用算法手册是一本非常实用和有价值的参考书,它可以让程序员掌握更多的C/C++算法技巧,提高程序员的编程能力和开发效率。 ### 回答3: C/C++ 常用算法手册是一本总结了 C/C++ 编程语言中常用算法、数据结构、设计模式等知识的参考书籍。 相对于其他语言,C 和 C++ 语言有着更高的执行效率和更多的编程自由度,也因此被广泛应用于开发高性能、底层的软件程序。在这样的应用场景下,对算法和数据结构的掌握显得尤为重要。 C/C++ 常用算法手册涵盖了各种基础的算法和数据结构,比如排序、查找、链表、树等。同时,它也介绍了一些常用的高级算法,比如动态规划、贪心算法和回溯算法。 此外,该手册还详细说明了面向对象编程领域中常用的设计模式和其实现方式,例如工厂模式、装饰器模式等。 阅读 C/C++ 常用算法手册不但能够让读者掌握常用算法的实现方,更能提高编程思维和技巧。另外,在实际应用中,编写高效的程序不仅需要算法的巧妙运用,更需要细致、严谨的代码风格和设计思路。此时,该手册中丰富的示例代码和编码规范性的讲解也能为读者提供很大的帮助。 总之,C/C++ 常用算法手册是一本既实用又深入的参考书,适合广大 C/C++ 开发者和算法学习者阅读。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血枫叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值