zoukankan      html  css  js  c++  java
  • 二分法查找

    介绍摘自百度百科:
    算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。主要思想是:(设查找的数组区间为array[low, high])
    (1)确定该区间的中间位置K(2)将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。区域确定如下:a.array[k]>T 由数组的有序性可知array[k,k+1,……,high]>T;故新的区间为array[low,……,K-1]b.array[k]<T 类似上面查找区间为array[k+1,……,high]。每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间缩小一半,递归找,即可。时间复杂度:O(log2n)。
    //下面是一个扩展类
    using System.Collections.Generic;
    using System.Linq;
    namespace DichotomizingAlgorithm
    {
        public static class RewriteArray
        {
            /// <summary>
            /// 对数组功能进行扩展
            /// </summary>
            /// <param name="i"></param>
            /// <returns></returns>
            public static int[] Sort(this int[] i)
            {
               List<int> list=i.ToList();
               list.Sort();
               i = list.ToArray<int>();
               return i;
            }
        }
    }
    using System;
    
    
    namespace DichotomizingAlgorithm
    {
        class Program
        {
           static  int[] num=new int[10];
            static void Main(string[] args)
            {
                InitData(); //自动载入数据
                Console.WriteLine("数值:");
                Console.Write("排序前:");
                foreach (int item in num)
                {
                    Console.Write(item + " ");
                }
                num=num.Sort(); //由小到大排序
                Console.Write("
    排序后:");
                foreach (int item in num)
                {
                    Console.Write(item + " ");
                }
                Console.WriteLine("
    请输入要查询数字:");
                int target = int.Parse(Console.ReadLine());
    
                int result = BinSearch(num, num.Length, target)+1;
                Console.WriteLine(target+"位于第"+result+"");
                Console.ReadKey();
            }
    
            static void InitData()
            {
                for (int i = 0; i < num.Length; i++)
                {
                    //由于Random.Next()生成的数据在短时间内会一样建议用下面的方法生成
                    var Seed = Guid.NewGuid().GetHashCode();
                    var value = new Random(Seed);
                    num[i] =value.Next(1,100);
                }
            }
    
            /// <summary>
            /// 二分法查找数据位置  当数据量大时可用此方法
            /// </summary>
            /// <param name="num">欲查找数据的数组</param>
            /// <param name="count">数据的长度</param>
            /// <param name="target">被查找的目标</param>
            /// <returns></returns>
            static int BinSearch(int[] num,int count,int target)
            {
                int low = 0;
                int high = count - 1;
                int mid;    
                while(low<=high)
                {
                    if(num[low]==target)
                    {
                        return low;
                    }
                    else if(num[high]==target)
                    {
                        return high;
                    }
                    //不用(high+low)/2 是为了防止数据溢出  
                    mid = low + ((high - low) / 2); 
                    if(num[mid]==target)
                    {
                        return mid;
                    }
                    if(num[mid]<target)
                    {
                        low = mid + 1;
                    }
                    else
                    {
                        high = mid - 1;
                    }         
                }
                return -1;  //没有找到的话返回-1
            }
        
        }
    }

    运行结果:

  • 相关阅读:
    Java单例模式
    svn 清理失败 (clean up 失败) 的解决方法
    linux chrome 安装过程记录
    docker
    linux-cat-grep
    linux-批量结束进程
    linux-压缩与解压缩(gz,zip,tar,jar,war)
    git-服务器地址切换
    linux-tomcat连接数查询
    git-无法add文件的问题
  • 原文地址:https://www.cnblogs.com/lichuangblog/p/8847782.html
Copyright © 2011-2022 走看看