精典算法之二分查找法

简介: 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。  二分查找法是已经排好顺序的集合,要从集合的中间开始查找,如果这个项小于我们要查找的数,则这个项前边的所有数都小于我们要查找的对象 就无需再浪费时间去查在前边的数查找;如果搜寻的数天于我们要查找的对象那么这个数的后边的数都大于我们要查找的对象,则后边的数我们也不用再去查找了。

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

 二分查找法是已经排好顺序的集合,要从集合的中间开始查找,如果这个项小于我们要查找的数,则这个项前边的所有数都小于我们要查找的对象
 就无需再浪费时间去查在前边的数查找;如果搜寻的数天于我们要查找的对象那么这个数的后边的数都大于我们要查找的对象,则后边的数我们也不用再去查找了。

下边我会用c#和c++两种语言给出代码

c#二分查找代码

 static void Main(string[] args)
        {
            int[] _array={ 1,3,5,6,10,14,16,20,21,23,28};
            int _findValue = BinSearch(_array, 0, _array.Length, 3);
            if (_findValue == -1)
            {
                Console.WriteLine("not find");
            }
            else
            {
                Console.WriteLine("find the value at " + _findValue);
            }
            Console.ReadLine();
        }

        static int BinSearch(int[] _array, int start, int end, int key)
        {
            int left, right;
            int mid;
            left = start;
            right = end;

            while (left <= right)
            {
                mid = (left + right) / 2;

                if (key < _array[mid])
                {
                    right = mid - 1;
                }
                else if (key > _array[mid])
                {
                    left = mid + 1;
                }
                else
                    return mid;
            }
            return -1;
        }

  

c++二分查找代码

int BinSearch(const int* Array,int start,int end,int key)
{
	int left,right;
	int mid;
	left=start;
	right=end;
	
	while(left<=right)
	{
		mid = (left + right)/2;

		if(key < Array[mid])
		{
			right = mid - 1;
		}
		else if(key > Array[mid])
		{
			left = mid + 1;
		}
		else
			return mid;
	}
	return -1;
}

int main(int argc,char* argv[])
{
	int _array[11] ={ 1,3,5,6,10,14,16,20,21,23,28};

	int _findInt =BinSearch( _array,0,(sizeof _array)/(sizeof _array[0]),3);
	if(_findInt == -1)
	{
		cout<<"not find"<<endl;
	}
	else
	{
		cout<<"find the Value at  "<<_findInt<<endl;
	}
	
	 return 0;
}

  

目录
相关文章
|
3月前
|
算法
再探二分法
【2月更文挑战第5天】
30 3
|
6月前
|
算法
代码随想录算法训练营第三十一天 | LeetCode 455. 分发饼干、376. 摆动序列、53. 最大子数组和
代码随想录算法训练营第三十一天 | LeetCode 455. 分发饼干、376. 摆动序列、53. 最大子数组和
37 0
|
8月前
|
算法 算法框架/工具 Android开发
LeetCode 周赛上分之旅 #47 前后缀分解结合单调栈的贡献问题
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
36 0
|
9月前
【八大排序(四)】快排-到底多快才能追上奔驰车里的夏树?(下)
【八大排序(四)】快排-到底多快才能追上奔驰车里的夏树?(下)
【八大排序(四)】快排-到底多快才能追上奔驰车里的夏树?(下)
|
9月前
【八大排序(四)】快排-到底多快才能追上奔驰车里的夏树?(上)
【八大排序(四)】快排-到底多快才能追上奔驰车里的夏树?
|
存储 算法 索引
【每日挠头算法题】LeetCode 1337. 矩阵中战斗力最弱的 K 行 —— 二分 + 排序 / 堆
【每日挠头算法题】LeetCode 1337. 矩阵中战斗力最弱的 K 行 —— 二分 + 排序 / 堆
100 0
【每日挠头算法题】LeetCode 1337. 矩阵中战斗力最弱的 K 行 —— 二分 + 排序 / 堆
|
算法 搜索推荐
算法笔记(二)——快排,归并算法(做成模板题)
算法笔记(二)——快排,归并算法(做成模板题)
算法笔记(二)——快排,归并算法(做成模板题)
|
机器学习/深度学习 算法
<<算法很美>>——(六)——回溯算法(下)—N皇后问题
<<算法很美>>——(六)——回溯算法(下)—N皇后问题
<<算法很美>>——(六)——回溯算法(下)—N皇后问题
回溯法、另辟蹊径法 求数组的全排序
回溯法、另辟蹊径法 求数组的全排序
47 0
回溯法、另辟蹊径法 求数组的全排序
|
算法 Kotlin
请收下今日份的编程技巧速递(二分查找和递归)
请收下今日份的编程技巧速递(二分查找和递归)
请收下今日份的编程技巧速递(二分查找和递归)