码迷,mamicode.com
首页 > 其他好文 > 详细

二分查找(折半查找)

时间:2016-01-29 19:50:24      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

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

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

时间复杂度: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("********************二分查找********************\n");
            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("\n**********展示结果**********\n");

            if (list != null && list.Count > 0)
            {
                foreach (var item in list)
                {
                    Console.Write("{0} ", item);
                }
            }
            Console.WriteLine("\n**********展示完毕**********\n");
        }
    }
}
技术分享

程序输出结果如图:

技术分享

 

二分查找(折半查找)

标签:

原文地址:http://www.cnblogs.com/nxxshxf/p/5169242.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!