zoukankan      html  css  js  c++  java
  • 顺序查找&折半查找

    顺序查找

    基本流程:从线性表的一端开始,逐一查找满足条件的线性表元素,有则返回元素位置信息,无则返回错误信息。

    #include <iostream>
    
    using namespace std;
    
    int seq_search(int arr[], int len, int key)
    {
        for(int i = 0 ; i < len ; i++)
        {
            if(arr[i] == key)
            {
                return i;
            }
        }
        return -1;
    }
    
    int main()
    {
        int arr[] = {1, 2, 3, 4, 5, 6};
        int num = 6;                //可以改为键盘输入,这里就不用了
        int len = sizeof(arr)/sizeof(int);
        int result = seq_search(arr, len, num);
        if(result != -1)
        {
            cout << num << "在数组中的位置是:" << result << endl;
        }
        else
        {
            cout << "未找到对应值。" << endl;
        }
        return 0;
    }
    

    顺序查找引入“哨兵”

    将数组arr中的末尾(或者首位)元素设置为需要查找的那个值,使得在循环过程中,不需要再判断数组下标是否越界。

    #include <iostream>
    
    using namespace std;
    
    int seq_search(int arr[], int key)
    {
        arr[7] = key;
        for(int i = 0 ; arr[i] != key ; i++)
        {
            ;
        }
        return i;
    }
    
    int main()
    {
        int arr[7];
        for(int i = 0; i < 6; i++)
        {
            arr[i] = i;
        }
        int num = 6;                //可以改为键盘输入,这里就不用了
        int result = seq_search(arr, num);
        if(result != 7)
        {
            cout << "The position in the array is: " << result << endl;
        }
        else
        {
            cout << "Can not find the value." << endl;
        }
        return 0;
    }
    

    折半查找

    折半查找也叫二分查找,用于有序的顺序表。

    基本流程是:首先将需要查找的值key与表中间位置元素比较。如果相等,则查找成功并返回存储位置。如果不等,则根据比较信息,将接下来需要查找的区间定位在前半或后半部分,再在相应的部分继续进行以上操作。如此重复直到找到或返回错误信息。

    #include <iostream>
    
    using namespace std;
    
    int bin_search(int arr[], int len, int key)
    {
        int low = 0;
        int high = len - 1;
        int mid;
        while(low <= high)
        {
            mid = (low + high)/2;
            if(arr[mid] < key)
            {
                low = mid + 1;
            }
            else if(arr[mid] > key)
            {
                high = mid - 1;
            }
            else
            {
                return mid;
            }
        }
        return -1;
    }
    
    int main()
    {
        int arr[] = {1, 2, 3, 4, 5, 6};
        int result = bin_search(arr, sizeof(arr)/sizeof(int), 4);
        if(result == -1)
        {
            cout << "Can not find the value." << endl;
        }
        else
        {
            cout << "The position in the array is: " << result << endl;
        }
        return 0;
    }
    
    
  • 相关阅读:
    【LeetCode-树】找树左下角的值
    【LeetCode-贪心】合并区间
    MongoDB3.6版本新增特性
    MongoDB initial sync过程
    MongoDB3.4版本新增特性
    保险配置原则
    MongoDB批量操作时字段为null时没有入库
    Kafka消费者没有收到通知的分析
    Git分支的管理
    NoSQLBooster如何MongoDB的部分文档从一个集合拷贝到另外一个集合中
  • 原文地址:https://www.cnblogs.com/echobiscuit/p/12957903.html
Copyright © 2011-2022 走看看