C#查找算法1:二分查找
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
原理:将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,
1. 如果x=a[n/2]则找到x,算法终止;
2. 如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x
3. 如果x>a[n/2],则我们只要在数组a的右 半部继续搜索
写法一:采用递归法
/// <summary>
/// 二分法查找,二分查找的条件是原数组有序
/// 没有找到,返回-1;找到了,则返回索引
/// </summary>
/// <param name="arr">数组</param>
/// <param name="low">开始索引</param>
/// <param name="height">结束索引</param>
/// <param name="value">要查找的对象</param>
static int BinarySearch(int[] arr, int low, int high, int value)
{ if (arr == null || arr.Length == 0 || low >= high)
{
return -1;
} int mid = (low + high) / 2;
if (value == arr[mid]) //刚好找到对象,返回索引
{ return mid;
}
else if (value > arr[mid]) // 要查找的对象在右边
{
return BinarySearch(arr, mid + 1, high,value);
}
else //要查找的对象在左边
{
return BinarySearch(arr, low, mid - 1, value);
} }
写法二:
static int BinarySearch2(int[]arr,int value)
{
int low = 0, high = arr.Length - 1,mid=0; while (low <= high)
{
mid = (low + high) / 2;
if(value== arr[mid])
{
return mid;
}
if (value > arr[mid])//在右侧
{
low = mid + 1;
}
else//在左侧
{
high = mid - 1;
} } return -1;
}
运行结果
static void Main(string[] args)
{
Console.WriteLine($"数据算法");
var arr1 = GetArrayData(8, 1, 22);
Console.WriteLine($"生成未排序数据arr1:{ShowArray(arr1)}");
//var arr2 = BubbleSort(arr1);
//Console.WriteLine($"冒泡排序:{ShowArray(arr2)}");
var arr3 = SelectSort(arr1);
Console.WriteLine($"选择排序arr3:{ShowArray(arr3)}");
var val = arr3[3]; var index= BinarySearch(arr3, 0, arr1.Length - 1,val);
Console.WriteLine($"{val}在 arr3中出现的索引位置是{index}");
var val2 = arr3[4];
var index2 = BinarySearch2(arr3, val2);
Console.WriteLine($"{val2}在 arr3中出现的索引位置是{index2}");
Console.ReadLine();
}

C#查找算法1:二分查找的更多相关文章
- 数据结构与算法之PHP查找算法(二分查找)
二分查找又称折半查找,只对有序的数组有效. 优点是比较次数少,查找速度快,平均性能好,占用系统内存较少: 缺点是要求待查表为有序表,且插入删除困难. 因此,折半查找方法适用于不经常变动而查找频繁的有序 ...
- python实现查找算法:二分查找法
二分查找算法也称折半查找,基本思想就是折半,和平时猜数字游戏一样,比如猜的数字时67,猜测范围是0-100,则会先猜测中间值50,结果小了,所以就会从50-100猜测,中间值为75,结果大了,又从50 ...
- Java查找算法之二分查找
二分查找是一种查询效率非常高的查找算法.又称折半查找. 一.算法思想 有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功. 一个情景:将表中间位置 ...
- python数组查找算法---bisect二分查找插入
1 实例 这个模块只有几个函数, 一旦决定使用二分搜索时,立马要想到使用这个模块 [python] view plaincopyprint? import bisect L = [1,3,3,6,8, ...
- 【算法】二分查找法&大O表示法
二分查找 基本概念 二分查找是一种算法,其输入是一个有序的元素列表.如果要查找的元素包含在列表中,二分查找返回其位置:否则返回null. 使用二分查找时,每次都排除一半的数字 对于包含n个元素的列表, ...
- javascript数据结构与算法---检索算法(二分查找法、计算重复次数)
javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){ if ( ...
- C语言查找算法之顺序查找、二分查找(折半查找)
C语言查找算法之顺序查找.二分查找(折半查找),最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 顺序查找 /*顺序查找 顺序查找是在一个已知无(或有序)序队列中找出与给定关键字相同的 ...
- 算法入门——二分查找,旅行商问题,大O表示法
一. 算法入门 博主在市面上发现了很多,很多有关书算法的书籍,但是真正能够让初学者易懂的算法书籍,只是一点点,以下我讲以 Aditya Bhargava写的一本关于算法的入门书籍,为参考,这本书非常的 ...
- 分治算法(二分查找)、STL函数库的应用第五弹——二分函数
分治算法:二分查找!昨天刚说不写算法了,但是突然想起来没写过分治算法的博客,所以强迫症的我…… STL函数库第五弹——二分函数lower_bound().upper_bound().binary_se ...
- PHP算法之二分查找和顺序查找
一.二分查找 (数组里查找某个元素) /** * 二分查找 (数组里查找某个元素) * $k为要查找的关键字(注:待查找的数组元素为奇数个)$low为查找范围的最小键值,$high为查找范围的最大键值 ...
随机推荐
- 【matlab混沌理论】1.2.洛伦兹吸引子
Lorenz洛伦兹吸引子定义洛伦兹函数组后,通过ode45函数求解此微分方程方程. input: % Lorenz函数的洛伦兹吸引子 % 2.定义模型参数 sigma = 10; beta = 8/ ...
- LeetCode1786:从第一个节点出发到最后一个节点的受限路径数(dijkstra + 记忆化搜索)
解题思路:比赛的是没读懂题意,这题求的是起点1到n路径序列数,但是路径序列上的相邻两个点 i, i+1 之间应该满足 i.i+1 到终点的最短路low[i] > low[i+1]. 因此需要先以 ...
- AtCoder Beginner Contest 071
第二次打日服... 感觉比较水.因为聚会的原因,还几十分钟结束的时候才打开电脑. D题就没看.难度不知. 题目链接http://abc071.contest.atcoder.jp/ ABC都水题. C ...
- 手动安装pinia、给项目添加pinia实例
用你喜欢的js包管理器安装pinia: yarn add pinia # 或者使用 npm npm install pinia 创建一个 pinia 实例 (根 store) 并将其传递给应用: 编辑 ...
- 聊聊流式数据湖Paimon(一)
翻译自 Apache Paimon官方文档 概览 概述 Apache Paimon (incubating) 是一项流式数据湖存储技术,可以为用户提供高吞吐.低延迟的数据摄入.流式订阅以及实时查询能力 ...
- 马某 说c# 不开源,他是蠢还是坏?
马某在视频 计算机主流开发语言的现状和未来3-5年的发展前景--Java.Golang.Python.C\C#\C++.JS.前端.AI.大数据.测试.运维.网络安全 点评各种语言,其中说到C# 的时 ...
- springMVC的基本介绍与入门
1:MVC是什么? MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. Model(模型):数据模型,提高要展示的数据 现在一般是分为Value ...
- 【Solve】InnerClass annotations are missing corresponding EnclosingMember annotations. Such InnerClass annotations are ignored
问题: 今天Android项目在build时出现了下面的警告: InnerClass annotations are missing corresponding EnclosingMember ann ...
- LeetCode 哈希表、映射、集合篇(242、49)
242. 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 示例 1: 输入: s = "anagram", t = " ...
- vscode 启动go
{ "version": "0.2.0", "configurations": [ { "name": "La ...