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
            }
        
        }
    }

    运行结果:

  • 相关阅读:
    PAT (Advanced Level) 1086. Tree Traversals Again (25)
    PAT (Advanced Level) 1085. Perfect Sequence (25)
    PAT (Advanced Level) 1084. Broken Keyboard (20)
    PAT (Advanced Level) 1083. List Grades (25)
    PAT (Advanced Level) 1082. Read Number in Chinese (25)
    HDU 4513 吉哥系列故事――完美队形II
    POJ Oulipo KMP 模板题
    POJ 3376 Finding Palindromes
    扩展KMP
    HDU 2289 Cup
  • 原文地址:https://www.cnblogs.com/lichuangblog/p/8847782.html
Copyright © 2011-2022 走看看