• 二分查找(折半查找)


    二分查找条件:有序数组。

    查找原理:查找过程从数组的中间元素开始,如果中间元素正好等于要查找的元素,则搜索过程结束;

    如果某一特定元素大于或小于中间元素,则在数组大于或小于中间原色的那一半中查找,而且跟开始一样从中间元素开始比较。

    如果在某一步骤数组为空,则代表找不到。

    这种搜索算法每一次比较都使搜索范围缩小一半。

    时间复杂度:O(logn)

    使用二分查找有两个前提条件:

    1,待查找的列表必须有序。

    2,必须使用线性表的顺序存储结构来存储数据。

    下面是实现代码。

    C#版:

    复制代码
    namespace BinarySearch.CSharp
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<int> list = new List<int> { 10,20,30,40,50,60,70,80,90 };
    
                Console.WriteLine("********************二分查找********************
    ");
                Display(list);
                int result = BinarySearch(list, 40);
                if (result != -1) Console.WriteLine("40在列表中的位置是:{0}", result);
                else Console.WriteLine("对不起,列表中不存在该元素!");
    
                Console.ReadKey();
            }
    
            /// <summary>
            /// 二分查找
            /// </summary>
            /// <param name="list">查找表</param>
            /// <param name="key">给定值</param>
            /// <returns>给定值在列表中的位置</returns>
            public static int BinarySearch(List<int> list, int key)
            {
                int low = 0;
                int high = list.Count - 1;
    
                while (low <= high)
                {
                    int middle = (low + high) / 2;
    
                    //判断中间记录是否与给定值相等
                    if (list[middle] == key)
                    {
                        return middle;
                    }
                    else
                    {
                        //在中间记录的左半区查找
                        if (list[middle] > key) high = middle - 1;
    
                        //在中间记录的右半区查找
                        else low = middle + 1;
                    }
                }
    
                //没有找到(查找失败)
                return -1;
            }
    
            private static void Display(IList<int> list)
            {
                Console.WriteLine("
    **********展示结果**********
    ");
    
                if (list != null && list.Count > 0)
                {
                    foreach (var item in list)
                    {
                        Console.Write("{0} ", item);
                    }
                }
                Console.WriteLine("
    **********展示完毕**********
    ");
            }
        }
    }
    复制代码

    程序输出结果如图:

    ds35

  • 相关阅读:
    任务二 发布作业信息(已完成)
    查看作业信息(任务一 已完成)
    项目冲刺任务之任务场景分析(四)
    项目冲刺之任务场景分析(三)
    解析XML文件的两种方式 SAX和DOM
    解析XML文件的两种方式 SAX和DOM
    iOS开发代码规范(通用)
    随机创建点击对象
    自定义加载等待框(MBProgressHUD)
    KVO、KVC
  • 原文地址:https://www.cnblogs.com/nxxshxf/p/5169242.html
Copyright © 2020-2023  润新知