• C#二分查找算法设计实现


    C#二分查找算法设计实现

    1.介绍

    二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。(记住了前提要求是顺序存储结构,而且要有序排序,所以说对于一个无序的是没法用二分查找的)

    2.查找算法过程

    举例就一个int类型数组为例 比如int[] intArray;

    假设数组中元素是按升序排列,将数组中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

    复杂度:O(lg n),n为要查找的元素个数。

    3.算法要求

    1. 必须采用顺序存储结构。
    2. 必须按关键字大小有序排列。

    4.算法实现

    这里以C#代码实现  

    4.1递归方法

     1         /// <summary>
     2         /// 二分查找递归实现
     3         /// </summary>
     4         /// <param name="arr">数组</param>
     5         /// <param name="low">开始索引 0</param>
     6         /// <param name="high">结束索引 </param>
     7         /// <param name="key">要查找的对象</param>
     8         /// <returns>返回索引</returns>
     9         public static int BinarySearch(int[] arr, int low, int high, int key)
    10         {
    11             int mid = (low + high) / 2;//中间索引
    12             if (low > high)
    13                 return -1;
    14             else
    15             {
    16                 if (arr[mid] == key)
    17                     return mid;
    18                 else if (arr[mid] > key)
    19                     return BinarySearch(arr, low, mid - 1, key);
    20                 else
    21                     return BinarySearch(arr, mid + 1, high, key);
    22             }
    23         }

    4.2While循环实现

     1         /// <summary>
     2         /// 二分查找While循环实现
     3         /// </summary>
     4         /// <param name="nums">数组</param>
     5         /// <param name="low">开始索引</param>
     6         /// <param name="high">结束索引</param>
     7         /// <param name="target">要查找的对象</param>
     8         /// <returns>返回索引</returns>
     9         public static int BinaryWhile(int[] nums, int low, int high, int target)
    10         {
    11             while (low <= high)
    12             {
    13                 int middle = (low + high) / 2;
    14                 if (target == nums[middle])
    15                 {
    16                     return middle;
    17                 }
    18                 else if (target > nums[middle])
    19                 {
    20                     low = middle + 1;
    21                 }
    22                 else if (target < nums[middle])
    23                 {
    24                     high = middle - 1;
    25                 }
    26             }
    27             return -1;
    28         }

    5.测试代码

     1         static void Main(string[] args)
     2         {
     3             int[] intArray = new int[] { 1,2,3,4,5,6,7,8,9,10};
     4             int result = BinarySearch(intArray,0,intArray.Length-1,5);
     5             Console.WriteLine(result.ToString());
     6             Console.WriteLine("-------------------------------------------");
     7             int resuleWhile = BinaryWhile(intArray,0,intArray.Length-1,5);
     8             Console.WriteLine(resuleWhile.ToString());
     9             Console.Read();
    10         }

    6.输出结果

    7.源代码工程下载

    源码工程项目文件下载

  • 相关阅读:
    好记性不如烂笔头,要经常把学习的东西记录下来
    liunx git 已经设置了ssh key 还是需要帐号和密码的解决方法。
    解决composer ssl required for SSL/TLS 证书配置
    composer SSL: Handshake timed out 解决办法
    小程序解密报错:IV passed is 24 bytes long which is longer than the 16 expected by se
    PHP面向对象试题(基础部分)
    php 单例模式
    在Thinkphp里面加入验证码插件
    phpstorm 修改默认注释
    用PHP去掉文件头的Unicode签名(BOM)
  • 原文地址:https://www.cnblogs.com/JiYF/p/9602931.html
Copyright © 2020-2023  润新知