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为查找范围的最大键值 ...
随机推荐
- [USACO2007NOVG] Telephone Wire G
题目描述 Farmer John's cows are getting restless about their poor telephone service; they want FJ to rep ...
- [ABC282E] Choose Two and Eat One
Problem Statement A box contains $N$ balls, each with an integer between $1$ and $M-1$ written on it ...
- Helm Chart 部署 Redis 的完美指南
目录 一.Helm介绍 二.安装Helm 三.配置Helm的repository 四.部署chart(以部署redis为例) 1. 搜索chart 2. 拉取chart 3. 修改values.yam ...
- 现代 CPU 技术发展
介绍 这篇文章主要是介绍CPU技术的发展,包括最近几十年CPU性能提升和半导体工艺发展,当前技术发展方向.希望可以帮助软件开发者理解CPU指令集和组成运行原理.CPU性能提升的现状和瓶颈.CPU技术发 ...
- bash shell笔记整理——basename和dirname命令
bashname命令作用 去掉给定name的目录部分,如果指定了 SUFFIX, 就 同时去掉SUFFIX(后缀).具体看示例吧. bashname语法 Usage: basename NAME [S ...
- sudo: unable to execute /bin/rm: Argument list too long
Linux,删除文件夹下所有内容,数据太多时,报错too long sudo rm -r /var/lib/jenkins/workspace/test_1/allure-report/data/at ...
- 98秒转录2.5小时音频,最强音频翻译神器IFW下载部署
IFW是一款功能强大的音频翻译工具,具备高速转录能力,能在短时间内完成大量音频处理,提高工作效率 以下是IFW在 Nvidia A100 - 80GB 上运行的一些基准测试: 最新中文版:https: ...
- 38. 干货系列从零用Rust编写负载均衡及代理,负载均衡中ip通行与禁止
wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...
- MySQL运维实战(1.3)安装部署:源码编译安装
作者:俊达 引言 在大多数情况下,我们不需要自己编译MySQL源码,因为编译的MySQL和二进制包的内容基本一致.然而,有些特殊情况可能需要我们采用源码编译的方式安装MySQL: 安装非标准版本的My ...
- java集合迭代器(Iterator)
1:什么是迭代器(Iterator): 在java中有很多存储数据的容器比如:(ArrayLIst,HashSet.....)每个容器都有自己的特点 因为内部结构不一样所以为了能对容器内元素的操作更简 ...