• c# 二分查找算法


    二分查找算法即折半查找,例如在一个有序数组中查找目标数应该插入到数组中的索引是多少?

    假设一个数组如下:

    int[] nums =  { 1, 3, 5, 6 };

    要计算把目标值插入到该数组中的索引值。最开始的思路:

    1.先把目标数插入到数组中

    2.进行排序

    3.返回索引

    代码如下:

      public int SearchInsert(int[] nums, int target) {
     int index = System.Array.IndexOf(nums, target);
            if(index>=0)
            {
                return index;
            }else
            {
                List<int> list = nums.ToList();
                list.Insert(nums.Length,target);
                nums = list.ToArray();
                System.Array.Sort(nums,(num1,num2)=>{return num1-num2;});
                return System.Array.IndexOf(nums, target);
            }
        }

    后面学习到可以用二分法来解决,代码如下:

     public static int SearchInsert(int[] nums, int target) {
            int start = 0;//开始索引
            int end = nums.Length - 1;//结束索引 
            int mid = 0;//取中间索引
            while (start <= end)
            {
                mid = start+(end - start) / 2;
                if (target == nums[mid]) { return mid; }
                if (nums[mid] > target)
                {
                    end = mid - 1;
                }
                else if (nums[mid] < target)
                {
                    start = mid + 1;
    
                }
            }
            return start;
        }

    代码解析:

    二分查找的思路是

    1.定义查找范围。start, end 开始索引和结束索引

    2.折半缩小查找范围即mid=start+(end - start) / 2;防止数值溢出

    如果目标数大于对半的数,则要插入的数在对半的右边,则开始查找的范围就需要更改为 start=mid+1;即对半之后的下一个数

    如果目标数小于对半的数,则要插入的数在对半的左边,则结束查找的范围就需要缩短到 end=mid-1;即对半的前一个数

    3.折半一次还没有找到就需要再次进行折半,重复步骤2的操作

  • 相关阅读:
    如何进入高效学习状态
    shell printf命令:格式化输出语句
    C# virtual、abstract
    git解决Could not execute editor
    go defer笔记
    git从其他分支提取文件merge到当前分支
    golang map
    状态模式
    golang单例模式
    go 单元测试时读取配置文件
  • 原文地址:https://www.cnblogs.com/97310ZT/p/10974279.html
Copyright © 2020-2023  润新知