二分查找的思路

本文详细介绍了二分查找的两种区间划分方法,包括左闭右闭的两种形式,并提供了C#实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于二分查找,一直稀里糊涂,终于在看了一些资料后,总结出一个比较实用的记法。

总的原则为,区间规则形式一样,区间之间不重复,不漏值。

令待查数组为source[],数组维数为size,要查的的数位key.

区间划分的原理:1、左闭右闭的划分法[ )

                           head=0,tail=size,mid=(head+tail)/2;

                           总区间为[0,size)

                           开始查找,if(key<source[mid]),则在前半部查找,区间令为[head,mid);即tail=mid

                                         if(key==source[mid]),则值已找到,  区间为   [mid,mid)

                                         if(key>source[mid]),则在后半部查找,区间令为[mid+1,tail);即head=mid+1

                           以上这三个部分的区间正好合为整个待查区间。

                     2、左闭右闭的划分法[ ]

                           head=0,tail=size-1,mid=(head+tail)/2;

                           总区间为[0,size-1]

                           开始查找,if(key<source[mid]),则在前半部查找,区间令为[head,mid-1];即tail=mid-1

                                         if(key==source[mid]),则值已找到,  区间为   [mid,mid]

                                         if(key>source[mid]),则在后半部查找,区间令为[mid+1,tail];即head=mid+1

                           以上这三个部分的区间正好合为整个待查区间。

这样是不是很好记了呢?

以下是C#实现[]形式的代码:

View Code
using System;
using System.Collections.Generic;
using System.Text;

namespace binary_search
{
    class Program
    {
       static int search(int[] source, int size, int key)
        {
            int head = 0;
            int tail = size - 1;
            int mid = (head + tail) / 2;
            int flag = 0;//用于标记能否查询到
            while (head <=tail) 
            {
                mid = (head + tail) / 2;
                if (source[mid] < key)
                {
                    head = mid + 1;                  
                }
                else if (source[mid] > key)
                {                  
                    tail = mid -1;           
                }
                else if (source[mid] == key)
                { 
                    flag = 1;
                    break;
                }
            } 
            if (flag==1)
                Console.WriteLine("{0}在目标数组的第{1}个位置", key, mid+1);
            else
                Console.WriteLine("{0}在目标数组中找不到", key);

            return 0;

        }
        static void Main(string[] args)
        {
            int[] a ={ 1, 2, 3, 4, 5,6 };
            int size = 6;
            int key = 4;
            search(a, size, key);
            Console.Read();
        }
    }
        
}

 

转载于:https://www.cnblogs.com/huang1990/archive/2013/04/02/2995284.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值