• 查找算法——顺序查找


    目录

    ​一、算法介绍

    1.算法思想

    2.算法流程

    二、算法实现

    1.代码实现

    2.测试用例及结果

    三、效率分析

    1.时间复杂度

    2.空间复杂度


    ​一、算法介绍

    1.算法思想

    顺序查找也称线性查找,其查找思想非常简单,只需对数组进行遍历并将待查找元素key与数组内元素逐个比较即可,若相同则查找成功返回对应数组下标;若遍历完整个数组也没有找到待查找元素,则说明查找失败,返回-1。

    2.算法流程

    例:给定一个数组arr[]={2,5,4,8,9,7},查找元素8,成功返回元素对应数组下标,失败返回-1。

    若采用上述示例查找元素10,则通过循环比较完数组arr中6个元素后,仍未找到待查找元素,则退出循环并返回-1。

    二、算法实现

    1.代码实现

    1. #include
    2. using namespace std;
    3. int SeqSearch(int* arr, int size, int key) {//顺序查找
    4. for (int i = 0; i < size; i++) {
    5. if (arr[i] == key) {
    6. return i;
    7. }
    8. }
    9. return -1;
    10. }
    11. void Test() {//测试函数
    12. int arr[] = { 2,5,4,8,9,7 };
    13. int length = sizeof(arr) / sizeof(arr[0]);//获取数组内元素个数
    14. int key;
    15. cout << "请输入待查找元素:";
    16. cin >> key;
    17. int result = SeqSearch(arr, length, key);//调用顺序查找函数
    18. if (result == -1) {
    19. cout << endl << "查找失败!" << endl;
    20. cout<<"集合中没有待查找元素!" << endl;
    21. }
    22. else {
    23. cout << "查找成功!" << endl;
    24. cout << "元素" << key << "所在位置下标为" << result << "!" << endl;
    25. }
    26. }
    27. int main() {
    28. Test();
    29. return 0;
    30. }

    2.测试用例及结果

    arr[]={2,5,4,8,9,7}

    查找元素8:

     查找元素7:

    查找元素10:

     

    三、性能分析

    1.时间复杂度

    最坏情况:

    待查找元素位于集合末尾位置或查找失败时,程序需遍历完整个集合才能退出,此时的循环次数与集合元素个数n有关,所以时间复杂度为O(n)。

    最好情况:

    最理想的情况就是待查找元素位于集合的第一个位置,程序只需执行一次循环和比较就成功找到待查找元素并返回退出,所以时间复杂度为O(1)。

    平均情况:

    综合两种情况,顺序查找的时间复杂度为O(n)。

    2.空间复杂度

    算法中只需设置一个临时变量用于控制循环次数和数组下标变化,没有借助额外的辅助空间,所以空间复杂度为O(1)。

    四、优化方案

    1.优化思想

    考虑到顺序查找的思想是通过顺序比较集合元素的方法进行查找,所以我们可以通过设置两个索引从集合的两边进行同时比较查找,这样每次循环就可以比较淘汰两个元素,从而一定程度上的提高算法效率。

    2.代码实现

    1. #include
    2. using namespace std;
    3. int Optimized_SeqSearch(int* arr, int size, int key) {//顺序查找优化版本
    4. int index1 = size - 1;//右侧索引
    5. int index2 = 0;//左侧索引
    6. while (index2 <= index1) {//相等位置也需要比较
    7. if (arr[index1] == key) {
    8. return index1;
    9. }
    10. if (arr[index2] == key) {
    11. return index2;
    12. }
    13. index1--;
    14. index2++;
    15. }
    16. return -1;
    17. }
    18. void Test() {//测试函数
    19. int arr[] = { 2,5,4,8,9,7 };
    20. int length = sizeof(arr) / sizeof(arr[0]);//获取数组内元素个数
    21. int key;
    22. cout << "请输入待查找元素:";
    23. cin >> key;
    24. //int result = SeqSearch(arr, length, key);//调用顺序查找函数
    25. int result = Optimized_SeqSearch(arr, length, key);//调用顺序查找函数
    26. if (result == -1) {
    27. cout << endl << "查找失败!" << endl;
    28. cout<<"集合中没有待查找元素!" << endl;
    29. }
    30. else {
    31. cout << "查找成功!" << endl;
    32. cout << "元素" << key << "所在位置下标为" << result << "!" << endl;
    33. }
    34. }
    35. int main() {
    36. Test();
    37. return 0;
    38. }

    3.测试用例及结果

    arr[]={2,5,4,8,9,7}

    查找元素8:

    查找元素7:

     

    查找元素0:

     

    活动地址:CSDN21天学习挑战赛

  • 相关阅读:
    七种方法增强代码可扩展性(多图详解)
    c++11 多线程支持 (std::async)
    swoole cURL error 1014: SSL verify failed
    IntelliJ IDE 插件开发 |(一)快速入门
    C++笔记 05
    快速使用ChatGpt Web Server
    Flutter的三棵树
    Java版 招投标系统简介 招投标系统源码 java招投标系统 招投标系统功能设计
    【深度学习CPU(番外篇)——初识总线】
    Python实现类属性的延迟加载装饰器
  • 原文地址:https://blog.csdn.net/m0_63020222/article/details/126103623