二分查找

数据结构-二分查找

半腔热情 提交于 2019-11-30 06:09:04
package com.datastack.search; /** * 二分查找 */ public class BinarySearch { public static void main(String[] args ) { int [] arr = new int []{1,2,3,4,5,6,7,8,9}; System. out .println( binarySearch ( arr , 9)); } public static int binarySearch( int [] array , int key ){ int low = 0; int hight = array . length -1; int middle = 0; while ( low <= hight ){ middle =( low + hight )/2; int value = array [ middle ]; if ( value > key ){ hight = middle -1; } else if ( value < key ){ low = middle +1; } else { return middle ; } } return -1; } } 来源: https://www.cnblogs.com/linux777/p/11565959.html

『嗨威说』算法设计与分析 - 算法第二章上机实践报告(二分查找 / 改写二分搜索算法 / 两个有序序列的中位数)

送分小仙女□ 提交于 2019-11-30 05:55:49
本文索引目录: 一、PTA实验报告题1 : 二分查找   1.1  实践题目   1.2  问题描述   1.3  算法描述   1.4  算法时间及空间复杂度分析 二、PTA实验报告题2 : 改写二分搜索算法   2.1  实践题目   2.2  问题描述   2.3  算法描述   2.4  算法时间及空间复杂度分析 三、PTA实验报告题3 : 两个有序序列的中位数   3.1  实践题目   3.2  问题描述   3.3  算法描述   3.4  算法时间及空间复杂度分析 四、实验心得体会(实践收获及疑惑) 一、PTA实验报告题1 : 二分查找   1.1  实践题目:   1.2  问题描述:       这道题主要阐述,给你一段有序的数字序列(已经排好序了),并给出需要查找的数Value,利用二分查找发法找出Value所在的下标,以及查找过程中所比较的次数。   1.3  算法描述:     二分查找的定义:       二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。       折半查找要求 线性表必须采用顺序存储结构 ,而且表中元素 按关键字有序排列 。     二分查找的操作:       假如以本例的样例来说,具体操作流程如下:       首先得到了一段数字序列,存入空间Temp:       将这段Temp数组送入递归中

01-复杂度3 二分查找

三世轮回 提交于 2019-11-30 05:54:28
问题描述 本题要求实现二分查找算法。 L是用户传入的一个线性表,其中ElementType元素可以通过>、==、<进行比较,并且题目保证传入的数据是递增有序的。函数BinarySearch要查找X在Data中的位置,即数组下标(注意:元素从下标1开始存储)。找到则返回下标,否则返回一个特殊的失败标记NotFound > typedef int Position; typedef struct LNode *List; struct LNode { > ElementType Data[MAXSIZE]; > Position Last; /* 保存线性表中最后一个元素的位置 */ }; > #include <stdio.h> > #include <stdlib.h> > > #define MAXSIZE 10 > #define NotFound 0 typedef int ElementType; > > typedef int Position; typedef struct LNode *List; struct LNode { > ElementType Data[MAXSIZE]; > Position Last; /* 保存线性表中最后一个元素的位置 */ }; > > List ReadInput(); /* 裁判实现,细节不表。元素从下标1开始存储 */

二分查找真的那么简单吗?——算法第二章上机实践报告

微笑、不失礼 提交于 2019-11-30 05:45:25
一、 实践题目 改写二分搜索算法 (20 分 ) 题目来源:《计算机算法设计与分析》,王晓东 设a[0:n-1]是已排好序的数组,请改写 二分搜索算法 ,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。 输入格式: 输入有两行: 第一行是n值和x值; 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔。 输出格式: 输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j。当搜索元素在数组中时,i和j相同。 提示:若x小于全部数值,则输出:-1 0 若x大于全部数值,则输出:n-1的值 n的值 输入样例: 在这里给出一组输入。例如: 6 5 2 4 6 8 10 12 输出样例: 在这里给出相应的输出。例如: 1 2 二、 问题描述 对二分搜索算法改进,已知是已经排好序的数组,对于输入的数据x,通过改进后的二分搜索算法,先判断x是比给定数组大(在数组右边)还是小(在数组左边),还是大小位于数组内,若在数组中有x则输出x所在数组下标否则输出比x小的最大数字的下标和比x大的最小数字的下标。 二分搜索可以找到x在数组中的数组下标,只要改进它,使之能够在x不在数组里的情况下得到结果就可以了。 三、 算法描述 1、 if(x<a[0]) cout<<"-1 0\n"; else if(x>a

STL:排序与检索

六眼飞鱼酱① 提交于 2019-11-29 22:14:29
首先来简单介绍一下STL是什么:STL全称“ standard template library”,中文名为“标准模板库”,可以这样说,STL就是“容器”,”算法“和其它一些组件的集合,目前它是c++中的一部分,用c++编写程序时可以直接使用。 STL可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)六个部分。 在C++标准中,STL被组织为下面的17个头文件:< algorithm >、< deque >、< functional >、< iterator >、< array >、< vector >、< list >、<forward_list>、<map>、<unordered_map>、<memory>、< numeric >、< queue >、< set >、<unordered_set>、< stack >和< utility >。 其中容器部分主要由头文件< vector >,<list>,<deque>,<set>,<map>,<stack>和<queue>组成。 算法部分主要由 头文件 <algorithm>,<numeric>和<functional>组成。 那么接下来要要探讨的 排序与检索

python之路——二分查找算法

谁都会走 提交于 2019-11-29 19:19:50
楔子 如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做? l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] 你说,so easy! l.index(66)... 我们之所以用index方法可以找到,是因为python帮我们实现了查找方法。如果,index方法不给你用了。。。你还能找到这个66么? l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] i = 0 for num in l: if num == 66: print(i) i+=1 上面这个方法就实现了从一个列表中找到66所在的位置了。 但我们现在是怎么找到这个数的呀?是不是循环这个列表,一个一个的找的呀?假如我们这个列表特别长,里面好好几十万个数,那我们找一个数如果运气不好的话是不是要对比十几万次?这样效率太低了,我们得想一个新办法。 二分查找算法 l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] 你观察这个列表,这是不是一个从小到大排序的 有序 列表呀? 如果这样

C语言数组

泪湿孤枕 提交于 2019-11-29 18:46:29
引用: int a,b,c,d,...... int sum => 定义一类或一组变量 数组 1. 数组是什么? 数组是一组具有相同类型的数据(变量)的集合 C 语言中数组: 一维数组 二维数组 三维数组 ... 其实, C 语言中只有一维数组 2 ,一维数组 2.1 定义格式 类型说明符 数组名 [ 整型表达式 ] {={ 初始化列表 }}; {}: 可要可不要 " 类型说明符 ": 指定数组元素的类型,任意 C 语言合法的类型都可以 “ 数组名 ”:对象的名字,命名要符合 C 语言标识符的规定 “ 整型表达式 ” :指定数组中元素的个数,一般为常量表达式 eg: #define N 3 int a[10];// 定义了一个数组,数组名 a, 里面有 10 个 int 型元素 typeof(a) => 一个具有 10 个 int 元素的数组类型 int[10] char b[10]; typeof(b) => 一个具有 10 个 char 元素的数组类型 char[10] int c;// 在程序运行的时候,为 c 分配 4 个字节的空间 在程序运行的时候,为 a 分配多大的空间? 10 个 int = 》 40 个字节 sizeof(a) =>40 2.2 一维数组在内存中的存放 在连续的地址空间中,从 低地址到高地址依次存放 数组中的每个元素。 意思

Python学习笔记之二分查找

最后都变了- 提交于 2019-11-29 16:37:22
二分查找 1、问题: 二分查找分数所在位置 2、实现代码: 3、相关解释: 3.0 binarySearch()函数参数: 3.1 原理 1、问题: 二分查找分数所在位置 2、实现代码: # 二分查找 递归方法实现 # 返回 x 在 arr 中的索引,如果不存在返回 -1 def binarySearch ( arr , l , r , x ) : # 基本判断 if r >= l : mid = int ( l + ( r - l ) / 2 ) # 元素整好的中间位置 if arr [ mid ] == x : return int ( x ) , mid # 元素小于中间位置的元素,只需要再比较左边的元素 elif arr [ mid ] > x : return binarySearch ( arr , l , mid - 1 , x ) # 元素大于中间位置的元素,只需要再比较右边的元素 else : return binarySearch ( arr , mid + 1 , r , x ) else : # 不存在 return - 1 , - 1 arr = input ( ) # 空格隔开 x = input ( ) arr = arr . split ( " " ) # 函数调用 result , num = binarySearch ( arr , 0 ,

大话数据结构学习笔记 - 查找之顺序查找、折半查找、插值查找及斐波那契查找

孤街醉人 提交于 2019-11-29 16:35:38
大话数据结构学习笔记 - 查找之顺序查找、折半查找、插值查找及斐波那契查找 查找( Searching ) : 就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录) 概论 概念 查找表( Search Table ) :由同一类型的数据元素(或记录)构成的集合 关键字( Key ) :数据元素中某个数据项的值,又称为键值,用来标识一个数据元素 主关键字( Primary Key ) :若关键字可以唯一的标识一个记录,则称此关键字为主关键字, 主关键字所在的数据项称为主关键码 次关键字( Secondary Key ) : 可以识别多个数据元素(或记录)的关键字 查找表 静态查找表 静态查找表( Static Search Table ) : 只做查找操作的查找表 查询某个特定数据元素是否在查找表中 检索某个特定数据元素和各种属性 动态查找表 动态查找表( Dynamic Search Table ) : 在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素 查找时插入数据元素 查找时删除数据元素 面向查找操作的数据结构称为查找结构 本文所有代码,示例数组为 {0,1,16,24,35,47,59,62,73,88,99} , 区间为 [1, 10] , 返回下标 0 则表示查找失败 顺序表查找 顺序查找(