鱼C论坛

 找回密码
 立即注册
查看: 1297|回复: 0

C++ 查找算法

[复制链接]
发表于 2020-2-4 18:16:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
查找算法


查找是在大量的信息中寻找一个特定的元素。

查找算法正式定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素。

顺序查找算法

顺序查找也称为线形查找,属于无序查找算法。

基本思想

从数据线性结构表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值 k 相比较,若相等则表示查找成功。

若扫描结束仍没有找到关键字为 k 的节点,表示查找失败。

说明:顺序查找适合于存储结构为顺序存储或链接存储的线性表(即数组)。

顺序查找算法举例

顺序找数

输入不重复的 n 个数(n < 1000),找一个指定的数 k。

输入为两行。第一行为数 n 和 k,表示数的个数和指定的数;第二行为 n 个数,以空格隔开。

输出为一行,表示数 k 在 n 个数中的位置;如果没有,则输出 "NO"。

我的程序如下:

  1. // 顺序找数问题

  2. #include <iostream>
  3. using namespace std;

  4. int main()
  5. {
  6.     int a[1000], n, k, i;
  7.     cin >> n >> k;
  8.     for (i = 0; i < n; i++)
  9.         cin >> a[i];
  10.     for (i = 0; i < n; i++)
  11.     {
  12.         if (a[i] == k)
  13.         {
  14.             cout << i;
  15.             return 0;
  16.         }
  17.     }
  18.     cout << "NO";
  19.     return 0;
  20. }
复制代码


二分查找算法

二分查找也称为折半查找,属于有序查找算法。

基本思想

用给定值 k 先与中间节点的关键字比较,中间结点把线性表分成两个子表,若相等则表示查找成功。

若不相等,再根据 k 与该中间结点的关键字比较结果确定下一步查找那个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的节点。

说明:元素必须是有序的,如果是无序的则要先进行排序操作。

二分查找举例

二分找数

输入排好序的不重复的 n 个数,找一个指定的数 k。

输入为两行,第一行为数 n 和 k,表示数的个数和指定的数;第二行为 n 个数,以空格隔开。

输出位一行,表示数 k 在 n 个数中的位置;如果没有,则输出 "NO"。

我的程序如下:

  1. // 利用二分查找算法找数

  2. #include <iostream>
  3. using namespace std;

  4. int main()
  5. {
  6.     int a[1000], n, k, i, mid, flag = 0, low = 1, high;
  7.     cin >> n >> k;
  8.     high = n;
  9.     for (i = 0; i < n; i++)
  10.     {
  11.         cin >> a[i];
  12.     }
  13.     for (i = 0; i < n; i++)
  14.     {
  15.         if (a[i] == k)
  16.         {
  17.             flag = 1;
  18.             break;
  19.         }
  20.     }
  21.     if (!flag)
  22.     {
  23.         cout << "NO";
  24.         return 0;
  25.     }
  26.     mid = (1 + n) / 2;
  27.     while (true)
  28.     {
  29.         if (a[mid] > k)
  30.         {
  31.             high = mid - 1;
  32.             mid /= 2;
  33.         }
  34.         else if (a[mid] < k)
  35.         {
  36.             low = mid + 1;
  37.             mid = high - mid;
  38.         }
  39.         else
  40.         {
  41.             cout << mid;
  42.             return 0;
  43.         }
  44.     }
  45. }
复制代码


递归实现二分查找:

  1. // 递归二分查找

  2. #include <iostream>
  3. using namespace std;

  4. void fun(int *a, int lo, int hi, int k)
  5. {
  6.     if (lo > hi)
  7.     {
  8.         cout << "NO";
  9.         return;
  10.     }
  11.     int mi = (lo + hi) / 2;
  12.     if (a[mi] == k)
  13.     {
  14.         cout << mi;
  15.         return;
  16.     }
  17.     else if (a[mi] > k)
  18.         fun(a, lo, mi - 1, k);
  19.     else
  20.         fun(a, mi + 1, hi, k);
  21. }

  22. int main()
  23. {
  24.     int a[1000] = {}, n, k, i, flag = 0, low = 1, high;
  25.     cin >> n >> k;
  26.     high = n;
  27.     for (i = 0; i < n; i++)
  28.     {
  29.         cin >> a[i];
  30.     }
  31.     fun(a, low, high, k);
  32.     return 0;
  33. }
复制代码


查找算法总结

查找算法有很多,这里只介绍了顺序查找和二分查找。

顺序查找就是一个一个排查。

二分查找就是一半一半排查,但是需要保证查找的是一个有序线性表。

二分查找的效率比顺序查找要高,但是其要求比顺序查找要高。

查找算法和枚举算法的相似和区别之处:

查找算法和枚举算法本质上都是搜索算法,二者是一个思路的东西。

但是枚举算法比较原始,要一个一个地去尝试。

查找算法更广泛,包括一些不是求出所有解的尝试。

枚举算法是全范围找解,不一定是找到解就结束。

查找算法是范围内找解,找到了解就可以结束。

评分

参与人数 1鱼币 +1 收起 理由
一个账号 + 1 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-28 03:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表