二分查找

习题1.8 二分查找 (20分) 数据结构

谁说胖子不能爱 提交于 2020-02-09 18:07:13
本题要求实现二分查找算法。 函数接口定义: Position BinarySearch( List L, ElementType X ); 其中 List 结构定义如下: typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; Position Last; /* 保存线性表中最后一个元素的位置 */ }; L 是用户传入的一个线性表,其中 ElementType 元素可以通过>、==、<进行比较,并且题目保证传入的数据是递增有序的。函数 BinarySearch 要查找 X 在 Data 中的位置,即数组下标(注意:元素从下标1开始存储)。找到则返回下标,否则返回一个特殊的失败标记 NotFound 。 裁判测试程序样例: #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; /*

二分查找排序

孤街浪徒 提交于 2020-02-09 03:22:20
首先对查找的列表有两个要求:(1)、必须采用顺序存储结构(2)、必须按关键大小有序排列 算法思想:首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等则查找成功,否则利用中间位置记录将表分成前后两个字表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。 重复上述过程,知道找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 测试程序如下所示: 点击( 此处 )折叠或打开 #include < stdio . h > int Find ( int a [ ] , int x , int length ) { int low , high ; int mid ; low = 1 , high = length ; while ( low < = high ) { mid = ( low high ) / 2 ; if ( x = = a [ mid ] ) return mid ; else if ( x > a [ mid ] ) low = mid 1 ; else high = mid - 1 ; } return 0 ; } int main ( ) { int length ; int i , x ; int flag ; int a [ 100 ] ; printf ( "请输入元素的个数: " ) ;

顺序查找和二分查找

余生长醉 提交于 2020-02-09 02:44:43
1. 使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组[转] 2.顺序查找 <?php //$n为待查找的数组元素的个数,$k为待查找的元素 function seq_sch($array, $n, $k) { $array[$n] = $k; for($i=0; $i<$n; $i++) { if($array[$i]==$k) { return true; break; } } if ($i<$n) //判断是否到数组的末尾 { return $i; } else { return false; } } $array = array(3, 6, 1, 9, 2, 10); $n = count($array); $k = 8; if(seq_sch($array, $n, $k)) { echo "顺序查找成功"; } else { echo "顺序查找失败"; } ?> 顺序查找 是在一个已知无序队列中找出与给定关键字相同的数的具体位置。原理是让关键字与队列中的数从第一个开始逐个比较,直到找出与给定关键字相同的数为止。 3.二分查找 <?php //$low为待查找的数组中的最小值,$high为数组中的最大值,$k为要查找的关键字 function bin_sch($array, $low, $high, $k) { if

二分查找算法(JAVA)

笑着哭i 提交于 2020-02-08 17:38:47
1.二分查找又称折半查找,它是一种效率较高的查找方法。 2.二分查找要求:(1)必须采用 顺序存储结构 (2).必须按关键字大小 有序排列 3.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后;将要查找的值和数组的中值进行比较,若小于中值则在中值前 面找,若大于中值则在中值后面找,等于中值时直接返回。然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分。     其查找的基本思路:首先将给定值K,与表中中间位置元素的关键字比较,若相等,返回该元素的存储位置;若不等,这所需查找的元素只能在中间数据以外的前半部分或后半部分中。然后在缩小的范围中继续进行同样的查找。如此反复直到找到为止。 4.实现:二分查找的实现用递归和循环两种方式 5.代码: 1 package other; 2 3 public class BinarySearch { 4 /* 5 * 循环实现二分查找算法arr 已排好序的数组x 需要查找的数-1 无法查到数据 6 */ 7 public static int binarySearch(int[] arr, int x) { 8 int low = 0; 9 int high = arr.length-1; 10 while(low <= high) { 11 int middle = (low + high)/2

二分查找法的实现和应用汇总

醉酒当歌 提交于 2020-02-08 17:33:43
二分查找法的实现和应用汇总 关于二分查找法 二分查找法 主要是解决在“一堆数中找出指定的数 ”这类问题。 而想要应用二分查找法,这“一堆数”必须有一下特征: 存储在数组中 有序排列 所以如果是用 链表 存储的,就无法在其上应用 二分查找法 了。(曽在面试被问二分查找法可以什么数据结构上使用:数组?链表?) 至于是顺序递增排列还是递减排列,数组中是否存在相同的元素都不要紧。不过一般情况,我们还是希望并假设数组是递增排列,数组中的元素互不相同。 二分查找法的基本实现 二分查找法在算法家族大类中属于“ 分治法 ”,分治法基本都可以用 递归 来实现的,二分查找法的递归实现如下: int bsearch(int array[], int low, int high, int target){ if (low > high) return -1; int mid = (low + high)/2; if (array[mid]> target) return binarysearch(array, low, mid -1, target); if (array[mid]< target) return binarysearch(array, mid+1, high, target); //if (midValue == target) return mid;}

使用bisect库实现二分查找

青春壹個敷衍的年華 提交于 2020-02-06 20:00:46
手动实现 假如有一个有序表 nums ,怎么样在 nums 里找到某个值的位置呢?没错,就是 nums.index(k) ,哈哈哈哈哈哈哈…… 假如 nums 很长很长,那就要祭出二分查找了 def binary_search(nums: List[int], k: int) -> int: if not nums: raise ValueError('list is empty') left, right = 0, len(nums)-1 while left <= right: mid = (right + left) // 2 if k < nums[mid]: right = mid - 1 elif k > nums[mid]: left = mid + 1 else: # if k == nums[mid]: return mid raise ValueError(f'{k} is not in list') 计算mid的公式为 (right + left) / 2 ,动态语言随便写,但是在静态语言中建议写成 left + (right - left) / 2 ,这样可以防止 right 和 left 都很大时, (right + left) 溢出。 使用bisect 二分查找可以给查找加速,但是每次写这么一段代码也够心烦。其实Python有这么一个库:bisect

STL中二分查找函数——binary_search//lower_bound//upper_bound//equal_range

无人久伴 提交于 2020-02-06 05:29:52
以下函数均需配合头文件< algorithm>和sort函数排序后使用 lower_bound int lower_bound(start,end,num); 返回值是int类型,返回的是一个指针,意义是在[start,end)范围内第一次遇到 大于或等于 num的下标。 upper_bound int upper_bound(start,end,num); 返回值是int类型,返回的是一个指针,意义是在[start,end)范围内第一次遇到 大于却不等于 num的下标。 binary_search bool binary_search(start,end,num); 返回值是bool类型,意义是在[start,end)范围内是否有num equal_range pair upper_bound(start,end,num); 返回值是pair类型,返回pair< i , j > 。意义是在[ i , j )区间上的数都等于num,相当于是lower_bound和upper_bound的结合 以上函数都是以二分为实现在已排好序的数组或容器中查找的函数,当返回值意义各不相同 (图片来自https://blog.csdn.net/u010700335/article/details/41323427) 来源: CSDN 作者: TSD_captain 链接: https://blog

ACM.二分查找

做~自己de王妃 提交于 2020-02-05 05:13:16
二分,分的是答案,直接在答案在的区间范围中二分,分出一个值,就判断是不是答案,并进行转移 如果已知候选答案的范围(min,max)(单调有序),有时候我们不必通过计算得到答案,只需在此范围内应用“二分”的过程,逐渐靠近答案(最后,得到答案)! 通过二分的方法,大幅度地跳过一片没必要的比较和选择。 一.二分查找 二分法求零点,把区间折半来找零点,虽然找不到具体的零点值但是可以确定大体零点的一个范围,达到一定精度后可以看作答案。 所以我们现在就是把这种思想转化为一个问题 即问题如下:给定一个有序的数组,查找k是否在数组中 分析:首先,将表中间位置记录的关键字与k比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子区间,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子区间,否则进一步查找后一子区间。 重复以上过程,直到找到满足条件的记录,使查找成功,或直到子区间不存在为止,此时查找不成功.容易知道算法的时间复杂度为O(logN)。 一.NEFU-956 二分查找 Problem:A Time Limit:1000ms Memory Limit:65536K Description 有n(1<=n<=1000005)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请找出序列中第1个大于x的数的下标! Input 输入数据包含多个测试实例

二分查找

做~自己de王妃 提交于 2020-02-04 10:32:24
二分查找又称折半查找,优点是比较次数少、查找速度快、平均性能好;其缺点是要求待查表为有序表,且插入删除困难,因此折半查找适用于不经常变动而查找频繁的有序序列。 def search(list, key): left = 0 # 左边界 right = len(list) - 1 # 右边界 while left <= right: mid = (left + right) // 2 # 取得中间索引 if key > list[mid]: left = mid + 1 elif key < list[mid]: right = mid - 1 else: return mid else: return -1 list = [2,3,4,5,6,7] print(search(list,2)) 来源: https://www.cnblogs.com/pp8080/p/12258480.html

6.旋转数组的最小数字

半城伤御伤魂 提交于 2020-02-04 07:08:02
题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 主要思路 这道题一看遍历一遍就能得到最小值,但是这么做没有意义,遍历一遍的时间复杂度是O(n),你的做法肯定要比O(n)快,即想到O(logn)。 编程题凡是看到O(logn)的时间复杂度一般都是二分查找。 二分查找要注意的点主要有两个。 一个是循环停止的条件。对于while(条件),要思考while停止时候达到的状态,要考虑等号等。 二是指循环内部,对于指针的赋值。比如二分查找需要left,right来更新查找区间,对于left,right的更新要思考清楚。 分析题目所给的旋转数组。 如{3,4,5,1,2},因为数组旋转之后,数组肯定有两部分,它们分别是有序的。 原数组前面的一些数放到了后面,所以要找的最小值就是两个部分交接处,右边的第一个数。所以目标是找到交界处。 这道题要考虑,若mid处与left、right处的值都相同,则不能使用二分,因为你没法确定选择哪个区间,所以只能遍历查找。 计算mid,如果mid处大于left处,则说明mid前是有序的,最小值肯定不在mid前面,所以更新left =