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为查找范围的最大键值 ...
随机推荐
- 解决报错:Java 8 date/time type `java.time.Duration` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling
1.错误信息: Java 8 date/time type java.time.Duration not supported by default: add Module "com.fast ...
- 16级C程序设计竞赛C题
问题 C: 回文 时间限制: 1 Sec 内存限制: 128 MB提交: 74 解决: 36[提交][状态][讨论版] 题目描述 给定一个字符串,你可以对字符串做任意改动,你可以在任意地方增加一个 ...
- 聊聊 从源码来看ChatGLM-6B的模型结构
基于ChatGLM-6B第一版,要注意还有ChatGLM2-6B以及ChatGLM3-6B 概述 ChatGLM是transformer架构的神经网络模型,因此从transformer结构入手,分析其 ...
- DVWA SQL Injection(SQL注入)全等级
SQL Injection(SQL回显注入) 目录: SQL Injection(SQL回显注入) 1. Low 2.Medium 3. High 4.Impossible 5.运用sqlmap自动化 ...
- django 定时任务 apscheduler 踩坑
本想每天定点的去查询一些数据然后用钉钉机器人发出来,前两三天还好好的,后面就执行 ERROR了 看了下错误问题,就跟连不上数据库一样,参考别人的解决方法 scheduler.add_job(every ...
- Java使用OSS实现上传文件
阿里云OSS使用 1.准备OSS 访问阿里云官网,注册并登录账户(支付宝方便一些,顺便冲点钱) 在产品分类中,找到阿里云oss 然后创建一个bucket 2.使用OSS(上传文件) 2.1在阿里云网站 ...
- 神经网络基础篇:详解导数(Derivatives)
导数 一个函数\(f(a)=3a\),它是一条直线.下面来简单理解下导数.让 看看函数中几个点,假定\(a=2\),那么\(f(a)\)是\(a\)的3倍等于6,也就是说如果\(a=2\),那么函数\ ...
- 教你用Java7的Fork/Join框架开发高并发程序
摘要:Fork/Join框架位于J.U.C(java.util.concurrent)中,是Java7中提供的用于执行并行任务的框架,其可以将大任务分割成若干个小任务,最终汇总每个小任务的结果后得到最 ...
- NDPQ(NDP+PQ),定义分布式数据库新方向
摘要:云服务提供商构建新的云原生关系数据库系统,专门为云基础架构设计,通常采用将计算和存储分离到独立扩展的分布式层的设计. 本文分享自华为云社区<性能提升100倍!GaussDB(for MyS ...
- BitSail“拍了拍”你,并给你一份快速入门指南
本 Quick Guide 面向 BitSail 新手入门使用人员,从源码编译.产物结构.如何提交作业.实机演示等多方面带领大家迅速入门 BitSail,从 0 到 1 了解并完成 BitSail 基 ...