查找算法简介&顺序表查找

  查找表是同一类型的数据元素构成的集合,根据操作方式,查找表可以分为两类:

    静态查找表:只进行查找操作;

    动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者删除已经存在的数据元素。

  为了提高查找的效率,我们专门为查找设置了相应的数据结构,称为查找结构根据查找用到的数据结构,可以将查找分为以下几类:

    :顺序表查找(顺序查找,有哨兵的顺序查找),有序表查找(二分查找,插值查找,斐波那契查找),哈希表查找;

    索引:稠密索引查找,分块索引查找,倒排索引查找;

    :二叉排序树查找,平衡二叉树查找。

  其中,借助于表和索引的查找为静态查找,借助于树的查找为动态查找。

  顺序查找查找过程:从表中的第一个或最后一个记录开始,依次将记录的关键字与给定的关键字进行比较,若某个记录的关键字与给定的关键字的值相等,则查找成功,返回该记录在查找表中的位置;否则,查找失败,返回0。

 1 //顺序查找
 2 //a,数组;n,数组长度;key,带查找的关键字
 3 int SequentialSearch(int* a, int n, int key)
 4 {
 5     for (int i = 1; i <= n; i++)//a[0]不参与查找
 6     {
 7         if (a[i] == key)
 8             return i;//返回key在数组a中的下标
 9     }
10     return 0;//返回0,说明查找失败,否则,查找成功
11 }

  上述顺序查找,每次循环都需要进行下标越界的判断,可以将a[0]设置为哨兵,解决需要进行下标越界判断的问题。

 1 //有哨兵的顺序查找
 2 int SequentialSearch2(int* a, int n, int key)
 3 {
 4     int i = n;//循环从数组的尾部开始
 5     a[0] = key;//哨兵,存储带查找的关键字的值
 6 
 7     //无论数组中是否存在待查找的关键字
 8     //最终一定会满足a[i] == key 的条件,因为key存在a[0]中
 9     while (a[i] != key )
10         i--;
11 
12     return i;//返回0,说明查找失败,否则,查找成功,返回key在数组a中的下标
13 }

参考书籍:程杰 著,《大话数据结构》,清华大学出版社。

原文地址:https://www.cnblogs.com/yongjin-hou/p/14012694.html