C#,初学琼林(05)——二分法查找(binary search,二分法搜索)数组内指定值的算法与源代码

二分法查找算法概述

二分法查找适用于数据量较大时,但是数据需要先排好顺序。主要思想是:(设查找的数组区间为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]

让我们假设我们有一个n元素的给定数组,我们想在其中找到一个给定的元素x。a[n-1]、a[n]。

如果对这个数组中的元素进行排序,我们可以使用一种非常快速的半搜索算法,也称为二进制搜索。下面我将介绍它的版本,以升序排列。该算法的名称来自于元素的搜索方式。让我们假设我们数组的初始索引由索引l表示,数组的最终索引由p表示。在课程开始时,l.1 a p.n。我们将这个数组除以一个索引等于s=(l抯p)/2的元素,这个除法是一个没有余数的除法,以便得到一个整数(毕竟,我们数组中元素的索引都是整数)。我们检查索引为s的元素是否是搜索的元素,如果是,我们结束算法,因为我们找到了搜索的元素。否则,我们将检查索引s下的元素是否大于搜索到的元素。如果是这样的话,我们知道索引为s+1、s+2、。p也更大(因为数组是按升序排序的)。因此,我们已经知道不需要查找该部分,所以我们将数组p结尾的索引设置为s-1,并重复将该数组一分为二,如前所述。当索引s下的元素小于搜索到的元素时,我们知道索引为s-1、s-2、。l小于您要查找的项(这是因为数组是按升序排序的)。因此,我们已经知道没有什么可查找的,所以我们将数组l开头的索引设置为s+1,并重复将该数组一分为二,如前所述。我们执行所描述的操作,直到找到搜索的元素,或者数组l开头的索引将大于数组p结尾的索引。如果发生这种情况,则意味着搜索的元素不在搜索的数组中。

C#,初学琼林(05)——二分法查找(binary search,二分法搜索)数组内指定值的算法与源代码_第1张图片

(一维数组)计算过程


假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2.
1.开始令front=0(指向3),end=7(指向88),则mid=3(指向36)。因为a[mid]>x,故应在前半段中查找。
2.令新的end=mid-1=2,而front=0不变,则新的mid=1。此时x>a[mid],故确定应在后半段中查找。
3.令新的front=mid+1=2,而end=2不变,则新的mid=2,此时a[mid]=x,查找成功。
如果要查找的数不是数列中的数,例如x=25,当第三次判断时,x>a[mid],按以上规律,令front=mid+1,即front=3,出现front>end的情况,表示查找不成功。
例:在有序的有N个元素的数组中查找用户输进去的数据x。
算法如下:
1.确定查找范围front=0,end=N-1,计算中项mid=(front+end)/2。
2.若a[mid]=x或front>=end,则结束查找;否则,向下继续。
3.若a[mid]x,说明待查找的元素值只可能在比中项元素小的范围内,则把mid-1的值赋给end,并重新计算mid,转去执行步骤2。

时间复杂度分析


1.最坏情况查找最后一个元素(或者第一个元素)Master定理T(n)=T(n/2)+O(1)所以T(n)=O(log2n)
2.最好情况查找中间元素O(1)查找的元素即为中间元素(奇数长度数列的正中间,偶数长度数列的中间靠左的元素)
 

C#源代码

Part of HArray.cs

public static class HArray
{
    /// 
    /// 二分法搜索
    /// 
    /// 
    /// 
    /// 
    /// 
    public static bool BinarySearch(int[] a, int x, out string echo)
    {
        int n = a.Length;
        int low = 0;
        int high = n - 1;
        while (low <= high)
        {
            int s = (low + high) / 2;
            if (a[s] == x)
            {
                echo = "Find element " + x + " at index of " + s;
                return true;
            }
            if (a[s] < x)
            {
                low = s + 1;
            }
            else
            {
                high = s - 1;
            }
        }
        echo = "Cann't found element " + x;
        return false;
    }
}

使用方法:

Part of Form1.cs

private void button1_Click(object sender, EventArgs e)
{
    int[] a = { 10, -5, 2, 3, 88, 3, -19, 23 };
    int x = 3;

    HArray.BinarySearch(a, x, out string echo);            
    MessageBox.Show(echo, "二分法查找");
}

你可能感兴趣的:(C#入门教程,Beginner‘s,Recipes,算法,数据结构,c#,数值计算,学习)