C++把二分查找算法写正确需要注意的地方

合集下载

二分查找法的算法过程

二分查找法的算法过程

二分查找法的算法过程
二分查找法(Binary Search)是一种在有序数组中查找特定元素的算法。

它的算法思想是将数组分为两部分,然后判断目标元素与中间元素的大小关系,进而确定目标元素在哪一部分中,然后再在相应的部分中继续进行查找,直到找到目标元素或确定目标元素不存在。

具体的算法过程如下:
1. 首先,确定数组的起始位置(start)和结束位置(end)。

- start 初始化为数组的第一个元素的索引。

- end 初始化为数组的最后一个元素的索引。

2. 然后,计算出数组的中间位置(mid)。

- mid = (start + end) / 2。

3. 接下来,比较目标元素与中间元素的大小关系。

- 如果目标元素等于中间元素,那么返回中间元素的索引,表示找到了目标元素。

- 如果目标元素小于中间元素,说明目标元素在数组的前半部分,所以将结束位置 end 更新为 mid - 1。

- 如果目标元素大于中间元素,说明目标元素在数组的后半部分,所以将起始位置 start 更新为 mid + 1。

4. 然后,再次计算新的中间位置,并重复步骤 3,直到找到目标元素或确定目标元素不存在。

- 如果 start 大于 end,表示数组中不存在目标元素。

通过以上的算法过程,可以高效地在有序数组中查找目标元素。

二分查找法的时间复杂度为 O(log n),其中 n 表示数组的长度。

它比线性查找等其他查找算法要更加高效,尤其适用于大规模数据的查找操作。

二分法解决问题实例及解答过程

二分法解决问题实例及解答过程

二分法解决问题实例及解答过程二分法,又称折半查找,是一种在有序数组中查找特定元素的方法。

它的原理是将数组中的数据按照某种顺序排列,然后每次查找时都将待查找的数据与数组中间的元素进行比较,逐步缩小查找范围,直到找到目标元素为止。

二分法的时间复杂度为O(log n),效率极高,在应对大量数据的查找时能够快速定位目标元素。

下面就用一个实际的问题来演示二分法的应用过程。

假设有一个有序数组arr,里面存储了一些数值,我们要在arr中查找目标值target,如果找到了就返回其索引,找不到就返回-1。

1.首先,我们要确定二分法的查找范围,即左边界和右边界。

在开始时,左边界为0,右边界为数组的长度减一。

2.接下来就是进入循环,不断进行比较和缩小查找范围的过程。

具体步骤如下:-计算中间元素的索引mid:mid = (left + right) / 2,取整数部分。

-比较中间元素和目标值的大小:-如果中间元素等于目标值,返回mid;-如果中间元素大于目标值,缩小查找范围:right = mid - 1;-如果中间元素小于目标值,缩小查找范围:left = mid + 1。

3.循环直到left大于right,这时表示已经查找完整个数组,依然没有找到目标值,返回-1。

下面我们用一个具体的例子来演示。

假设有一个有序数组arr = [1, 3, 5, 7, 9, 11, 13, 15],要在arr中查找目标值为9。

首先,初始化左右边界:left = 0right = 7进入循环:1.第一轮循环:-计算中间元素的索引:mid = (0 + 7) / 2 = 3- arr[mid] = 7,小于目标值9,所以更新左边界:left = mid +1 = 42.第二轮循环:-计算中间元素的索引:mid = (4 + 7) / 2 = 5- arr[mid] = 11,大于目标值9,所以更新右边界:right = mid - 1 = 43.第三轮循环:-计算中间元素的索引:mid = (4 + 4) / 2 = 4- arr[mid] = 9,等于目标值9,找到目标值,返回mid。

二分法计算

二分法计算

二分法计算
二分法,又称折半查找,是一种在有序数组中查找特定元素的常用算法。

它的基本思想是将数组从中间分成两部分,判断目标元素位于左半边还是右半边,然后继续在相应的子数组中进行查找,直到找到目标元素或子数组为空为止。

这种算法的时间复杂度为O(log(n)),效率较高。

实现二分法查找的步骤如下:
1. 首先,确定有序数组的起始索引left和结束索引right,分别为0和数组长度减1。

2. 计算中间元素的索引mid,可以使用公式mid = (left + right) / 2。

3. 比较中间元素与目标元素的大小关系:
- 如果中间元素等于目标元素,那么目标元素已经找到,返回该索引。

- 如果中间元素大于目标元素,说明目标元素位于左半边,将结束索引right更新为mid-1。

- 如果中间元素小于目标元素,说明目标元素位于右半边,将起始索引left更新为mid+1。

4. 重复步骤2和步骤3,直到找到目标元素或子数组为空。

需要注意的是,二分法只适用于有序数组。

如果数组无序,需要先对数组进行排序操作,再进行二分查找。

总之,二分法是一种高效的查找算法,可以在有序数组中快速定位目标元素,降低查找的时间复杂度。

二分法的基本原理和应用

二分法的基本原理和应用

二分法的基本原理和应用1. 什么是二分法二分法(Binary Search)是一种在有序数组中查找目标值的常用算法。

该算法通过将数组分成两半并检查目标值位于哪一半来递归地查找目标值。

2. 二分法的基本原理二分法的基本原理是不断将查找范围分成两半,然后通过比较目标值和中间值来确定目标值所在的区间。

具体步骤如下:1.初始化左侧指针为0,右侧指针为数组长度减1,表示查找范围为整个数组。

2.重复以下步骤,直到左侧指针大于右侧指针:1.计算中间指针的位置,即将左侧指针与右侧指针相加并除以2。

2.比较目标值和中间值:•如果目标值等于中间值,则返回中间指针作为结果,表示找到目标值。

•如果目标值小于中间值,则将右侧指针更新为中间指针减1,表示继续在左半区间查找。

•如果目标值大于中间值,则将左侧指针更新为中间指针加1,表示继续在右半区间查找。

3.如果循环结束,左侧指针大于右侧指针,说明目标值不存在于数组中,返回查找失败的结果。

3. 二分法的应用场景二分法主要应用于有序数组或有序列表中的查找问题。

由于二分法每次可以将查找范围减半,所以其时间复杂度为O(log n),比线性查找的时间复杂度O(n)更加高效。

以下是一些常见的二分法应用场景:•查找有序数组中的某个元素•在字符串中查找某个单词•查找某个数的平方根•查找某个数在数组中的插入位置•在旋转有序数组中查找目标值4. 二分法的优缺点4.1 优点•时间复杂度为O(log n),比线性查找更加高效。

•可以在有序数组或列表中快速查找目标值。

4.2 缺点•仅适用于有序数组或列表,对于无序数组或列表无法使用。

•添加、删除元素会破坏数组或列表的有序性,需要维护有序性。

5. 二分法的算法实现以下是一个用Python语言实现的二分法算法示例:```python def binary_search(nums, target): left, right = 0, len(nums) - 1 while left <= right: mid = (left + right) // 2 if nums[mid] == target: return mid elif nums[mid] < target: left = mid + 1 else: right = mid - 1 return -1 # 查找失败nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] target = 5 result = binary_search(nums, target) if result != -1: print(。

c++二分查找函数

c++二分查找函数

c++二分查找函数二分查找,也称作折半查找,是一种在有序序列中查找指定数据的高效算法。

它的基本思想是:将待查序列分成大小相等的两个子序列,进行比较,若查找元素不在中间元素,则根据比较结果,将其定向到其他子序列中去,进行下一轮查找,重复上述步骤,直到找到或者查找失败为止。

因此,在C++中,二分查找算法的实现可以如下:```int binarySearch(int arr[], int l, int r, int x) { if (r >= l) { int mid = l + (r - l)/2; // 如果中间元素是查找的元素,则返回if (arr[mid] == x) return mid; // 如果查找的元素小于中间元素,则查找左子序列 if (arr[mid] > x) return binarySearch(arr, l, mid-1, x); // 如果查找的元素大于中间元素,则查找右子序列 return binarySearch(arr, mid+1, r, x); } // 查找失败 return -1; } ```以上代码实现了二分查找算法,其中arr[]为要查找的有序数组,l和r分别表示要查找的数组的下标的左右边界,x为要查找的元素。

在每次比较中,如果找到了要查找的元素,就返回其下标,如果没有找到,就返回-1。

二分查找的时间复杂度为O(logn),比较次数是有序序列的长度的对数,因此,它是一种很有效的查找方式。

但是,它有一个缺点就是它只适用于查找有序序列,如果待查找序列是无序的,就不能使用二分查找了。

总之,二分查找是一种高效的查找算法,能够在有序序列中快速查找指定数据,但是它的应用范围受限于有序序列。

因此,在使用它之前,要先确定要查找的序列是否有序,否则就不能使用这种算法了。

二分法的算法描述

二分法的算法描述

二分法的算法描述
二分法算法描述
二分法是一种常用的算法,也称为折半查找法。

它的基本思想是将一个有序的数组分成两个部分,然后判断目标值在哪个部分,再在该部分中继续进行查找,直到找到目标值或者确定目标值不存在为止。

二分法的算法描述如下:
1. 首先,确定数组的左右边界,即左边界为0,右边界为数组长度减1。

2. 然后,计算出数组的中间位置,即中间位置为左右边界之和除以2。

3. 接着,判断目标值与中间位置的值的大小关系,如果目标值小于中间位置的值,则在左半部分继续查找,否则在右半部分继续查找。

4. 如果目标值等于中间位置的值,则直接返回中间位置。

5. 如果左右边界相遇,但是目标值仍未找到,则说明目标值不存在,返回-1。

6. 如果目标值在左半部分,则将右边界设为中间位置减1,继续执行步骤2。

7. 如果目标值在右半部分,则将左边界设为中间位置加1,继续执行步骤2。

二分法的时间复杂度为O(log n),比线性查找的时间复杂度O(n)要快得多。

因此,在需要查找有序数组中的元素时,二分法是一种非常高效的算法。

二分法的应用场景很多,例如在搜索引擎中,可以使用二分法来查找关键词在文档中的位置;在游戏中,可以使用二分法来查找玩家的位置等等。

二分法是一种非常实用的算法,可以大大提高查找效率,值得我们在编程中多加应用。

c 二分法查表 函数

c 二分法查表 函数

c 二分法查表函数二分查找法是一种在有序数组中查找某一特定元素的搜索算法。

搜索过程从数组的中间元素开始,如果中间元素正好是目标值,则搜索过程结束;如果目标值大于或小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且同样从中间元素开始比较。

如果在某一步骤数组为空,则代表找不到。

以下是一个用C语言实现的二分查找法的例子:```c#include <stdio.h>int binary_search(int arr[], int l, int r, int x){while (l <= r) {int m = l + (r - l) / 2;// 如果x 存在于mid 中if (arr[m] == x)return m;// 如果x 小于mid,那么只能在左半部分中查找if (arr[m] > x)r = m - 1;// 如果x 大于mid,那么只能在右半部分中查找elsel = m + 1;}// x 不在数组中,返回-1return -1;}int main(){int arr[] = {2, 3, 4, 10, 40};int n = sizeof(arr) / sizeof(arr[0]);int x = 10;int result = binary_search(arr, 0, n - 1, x);(result == -1) ? printf("Element is not present in array"): printf("Element is present at index %d", result);return 0;}```这个程序首先定义了一个有序数组,然后定义了一个目标值x,接着调用二分查找函数binary_search来查找x在数组中的位置。

如果找到了x,函数就返回x 在数组中的位置;否则,返回-1表示x不在数组中。

二分查找详解

二分查找详解

⼆分查找详解看到⼀个⼤佬的博客,有⼀段内容让我深有感触:我周围的⼈⼏乎都认为⼆分查找很简单,但事实真的如此吗?⼆分查找真的很简单吗?并不简单。

看看 Knuth ⼤佬(发明 KMP 算法的那位)怎么说的:Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky...这句话可以这样理解:思路很简单,细节是魔⿁。

这两个⽉刷题遇到不少要⽤到⼆分查找的题。

当年学数据结构的时候觉得这是⼀个相当直观且好理解的算法,但是真正刷题时觉得这个算法需要注意的坑还是挺多的。

最普通的应⽤就是找某个元素的索引(数组有序且不重复),再复杂⼀些的还有找某个元素最左边或最右边的索引。

更⾼端的有对数组的索引或者数组中整数的取值范围进⾏⼆分查找,不过这⼀块还是万变不离其宗,查找的范围依旧是[left, right],难点在于要怎么找到⼆分查找的对象。

⼆分查找基本框架def binarySearch(arr: List[int], target: int):n = len(arr)left, right = 0, ... # 左右边界的赋值可变while left ... right: # 需要注意有没有等号mid = left + (right - left) // 2if arr[mid] == target:... # 要不要直接returnelif arr[mid] < target:left = ... # 要不要加⼀elif arr[mid] > target:right = ... # 要不要减⼀return ... # 有返回mid的,有left的各种上⾯⼀段代码中的...部分是需要根据题⽬需要修改的地⽅,也就是⼆分查找的细节所在。

另外,计算mid的公式也可以写成mid = (left + right) // 2,按上⾯那样写是为了防⽌溢出(虽然在Python⾥并不会有整型溢出的问题,不过最好养成这个习惯)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档