博客
关于我
C#基础搜索算法
阅读量:609 次
发布时间:2019-03-12

本文共 2592 字,大约阅读时间需要 8 分钟。

C#基础搜索算法

大家好,我是苏州程序大白。本文将介绍C#中基础的搜索算法,包括顺序搜索和二叉搜索。顺序搜索适用于数据项随机排列的情况,而二叉搜索则用于数据项有序排列的情况。


顺序搜索算法

顺序搜索(线性搜索)是最直接的搜索方法。它从数组的开始处依次遍历每个元素,直到找到目标数据项或遍历完整个数组。具体实现如下:

bool SeqSearch(int[] arr, int sValue){    for (int index = 0; index < arr.Length; index++)    {        if (arr[index] == sValue)            return true;    }    return false;}

如果在遍历过程中找到匹配项,函数会立即返回true;如果遍历完整个数组仍未找到目标项,函数则返回false


搜索最小值和最大值

在无序数组中,搜索最小值或最大值需要遍历所有元素并进行比较。以下是搜索最小值的实现:

static int FindMin(int[] arr){    int min = arr[0];    for (int i = 0; i < arr.Length - 1; i++)    {        if (arr[i] < min)            min = arr[i];    }    return min;}

同理,搜索最大值的实现如下:

static int FindMax(int[] arr){    int max = arr[0];    for (int i = 0; i < arr.Length - 1; i++)    {        if (arr[i] > max)            max = arr[i];    }    return max;}

通过自组织数据加快顺序搜索速度

为了提高顺序搜索效率,可以采用自组织数据的方法。每次搜索到目标数据项时,将其移动到数组的前面。例如,以下代码实现了自组织优化:

public int SeqSearch(int sValue){    for (int index = 0; index < arr.Length; index++)    {        if (arr[index] == sValue)        {            if (index > arr.Length * 0.2)            {                swap(index);            }            return index;        }    }    return -1;}void swap(int index){    int temp = arr[index];    for (int i = index; i > 0; i--)    {        arr[i] = arr[i - 1];    }    arr[0] = temp;}

这种优化方法将频繁访问的数据项移动到数组前面,减少了后续搜索的次数。


二叉搜索算法

当数据项按顺序排列时,二叉搜索是更高效的选择。其工作原理如下:

  • 设置初始上下限。
  • 计算中间索引,比较目标值与中间项。
  • 如果目标值等于中间项,搜索结束。
  • 如果目标值小于中间项,调整上限为中间索引减一。
  • 如果目标值大于中间项,调整下限为中间索引加一。
  • 以下是二叉搜索的实现:

    public int binSearch(int value){    int upperBound = arr.Length - 1;    int lowerBound = 0;    while (lowerBound <= upperBound)    {        int mid = (upperBound + lowerBound) / 2;        if (arr[mid] == value)        {            return mid;        }        else if (value < arr[mid])        {            upperBound = mid - 1;        }        else        {            lowerBound = mid + 1;        }    }    return -1;}

    递归二叉搜索算法

    二叉搜索也可以使用递归实现。以下是递归版本的代码:

    public int RbinSearch(int value, int lower, int upper){    if (lower > upper)        return -1;    int mid = (upper + lower) / 2;    if (value < arr[mid])        return RbinSearch(value, lower, mid - 1);    else if (value == arr[mid])        return mid;    else        return RbinSearch(value, mid + 1, upper);}

    递归实现的优点是代码简洁,缺点是性能较差。对于大型数组,迭代二叉搜索更为高效。


    C#内置方法

    C#提供了内置的二叉搜索方法Array.BinarySearch,可以直接调用:

    public int Bsearh(int value){    return Array.BinarySearch(arr, value);}

    内置方法通常性能更优,但依赖于语言运行时环境。


    性能对比

    递归二叉搜索的效率较低,通常比迭代版本慢10倍。以下是性能对比结果:

    递归:1000次搜索用时:42.8秒迭代:1000次搜索用时:4.3秒

    在实际应用中,应根据性能需求选择合适的实现方式。


    通过以上内容,希望读者能够全面了解C#中的基础搜索算法,包括顺序搜索、二叉搜索以及自组织数据的优化方法。感谢您的阅读!

    转载地址:http://oyrtz.baihongyu.com/

    你可能感兴趣的文章
    python - 数据描述符(class 内置 get/set/delete方法 )
    查看>>
    Python - 根据值绘制彩色网格
    查看>>
    Python - 正则表达式在括号之间获取数字
    查看>>
    python binascii.Error: Incorrect padding
    查看>>
    Python C 程序子进程在“for line in iter“处挂起
    查看>>
    python check_output 失败,退出状态为 1,但 Popen 适用于相同的命令
    查看>>
    Python CONNECT 4 CHECK WIN函数
    查看>>
    python ctypes库中动态链接库加载方式
    查看>>
    python cv2 图像( np array )转 HObject
    查看>>
    python cv2截取不规则区域图片
    查看>>
    python CV2裁剪图片并保存
    查看>>
    python cv2读取rtsp实时码流按时生成连续视频文件
    查看>>
    Python Dataframe Groupby Mean和Std
    查看>>
    python datetime
    查看>>
    python datetime笔记
    查看>>
    python day01
    查看>>
    python day10
    查看>>
    python decode和encode
    查看>>
    Python Dict 理解创建和更新字典
    查看>>
    Python Discord Bot - python clear_reaction() 清除所有反应而不是特定反应
    查看>>