请给我写出一个二分查找代码
时间: 2023-05-11 18:05:11 浏览: 46
当然可以,以下是一个简单的二分查找代码:
```python
def binary_search(arr, target):
left = 0
right = len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
```
这个函数接受一个已经排序好的数组和一个目标值,返回目标值在数组中的索引,如果目标值不存在于数组中,则返回 -1。
相关问题
用abap写一个二分查找代码
### 回答1:
以下是在 SAP ABAP 中实现二分查找的代码示例:
```
REPORT z_binary_search.
DATA: lv_array TYPE STANDARD TABLE OF i,
lv_value TYPE i,
lv_index TYPE i,
lv_found TYPE abap_bool.
* 初始化数组
lv_array = VALUE #( (1) (2) (3) (4) (5) ).
* 要查找的值
lv_value = 3.
* 初始化查找边界
DATA(lv_low) = 1.
DATA(lv_high) = lines( lv_array ).
* 开始二分查找
WHILE lv_low <= lv_high.
lv_index = lv_low + trunc( ( lv_high - lv_low ) / 2 ).
IF lv_array[ lv_index ] EQ lv_value.
lv_found = abap_true.
EXIT.
ELSEIF lv_array[ lv_index ] < lv_value.
lv_low = lv_index + 1.
ELSE.
lv_high = lv_index - 1.
ENDIF.
ENDWHILE.
* 输出结果
IF lv_found = abap_true.
WRITE:/ '找到了 ', lv_value, ' 在数组中的索引为 ', lv_index.
ELSE.
WRITE:/ '未找到 ', lv_value, ' 在数组中的索引。'.
ENDIF.
```
该代码首先创建一个整数数组 `lv_array`,其中包含 1 到 5 的整数。然后它定义了要查找的值 `lv_value`,以及一个名为 `lv_index` 的变量来保存找到的索引,以及一个布尔变量 `lv_found` 来表示是否找到了该值。接下来,代码初始化了查找边界 `lv_low` 和 `lv_high`,开始二分查找。
在每次迭代中,代码计算数组的中间索引 `lv_index`,并根据该值与 `lv_value` 的比较结果更新 `lv_low` 或 `lv_high`。如果找到了 `lv_value`,则将 `lv_found` 设置为真,并退出循环。最后,代码根据 `lv_found` 的值输出结果。
请注意,此示例仅针对整数数组。如果需要在更复杂的数据结构中进行二分查找,则需要根据情况修改代码。
### 回答2:
ABAP是一种面向对象的编程语言,用于开发SAP系统。下面是一个用ABAP语言编写的二分查找代码示例:
DATA: lv_table TYPE STANDARD TABLE OF i WITH DEFAULT KEY,
lv_search_value TYPE i VALUE 10,
lv_low TYPE i,
lv_high TYPE i,
lv_middle TYPE i.
lv_table = VALUE #( (1), (4), (7), (10), (13), (16), (19) ).
SORT lv_table ASCENDING.
lv_low = 1.
lv_high = LINES( lv_table ).
WHILE lv_low <= lv_high.
lv_middle = ( lv_low + lv_high ) / 2.
IF lv_table[ lv_middle ] = lv_search_value.
WRITE: '要查找的数值在表中的索引为', lv_middle.
EXIT.
ELSEIF lv_table[ lv_middle ] < lv_search_value.
lv_low = lv_middle + 1.
ELSE.
lv_high = lv_middle - 1.
ENDIF.
ENDWHILE.
IF lv_low > lv_high.
WRITE: '要查找的数值在表中不存在'.
ENDIF.
上面的代码首先定义了一个整型的内表lv_table,并初始化了一些数据。然后使用SORT语句对内表进行升序排序。
接下来,定义了变量lv_low和lv_high用于表示查找范围的下界和上界。通过循环,不断更新lv_low和lv_high的值,直到lv_low大于lv_high为止。
在每次循环中,求出当前查找范围的中间索引lv_middle,并将当前索引处的元素与要查找的值进行比较。如果相等,则找到了要查找的值,输出其索引,并使用EXIT语句退出循环。如果当前索引处的值小于要查找的值,则将lv_middle加1,更新lv_low的值;否则,将lv_middle减1,更新lv_high的值。
循环结束后,通过判断lv_low是否大于lv_high,来确定要查找的值是否存在于表中。
### 回答3:
二分查找是一种高效的查找算法,可以在有序数组中快速定位目标值。在ABAP中,可以使用以下代码实现二分查找:
首先,定义一个函数来实现二分查找:
```
FUNCTION binary_search.
DATA: lv_result TYPE i,
lv_low TYPE i,
lv_high TYPE i,
lv_mid TYPE i.
lv_low = 0.
lv_high = lines(p_values) - 1.
WHILE lv_low <= lv_high.
lv_mid = ( lv_low + lv_high ) / 2.
IF p_values[ lv_mid ] = p_target.
lv_result = lv_mid.
EXIT.
ELSEIF p_values[ lv_mid ] < p_target.
lv_low = lv_mid + 1.
ELSE.
lv_high = lv_mid - 1.
ENDIF.
ENDWHILE.
IF lv_result = 0.
WRITE: '目标值未找到' .
ELSE.
WRITE: '目标值的索引为', lv_result .
ENDIF.
ENDFUNCTION.
```
在调用函数时,需要传入有序数组 `p_values` 和目标值 `p_target`。函数会返回目标值在数组中的索引位置,如果目标值不存在,则会输出"目标值未找到"。
例如,现有一个有序数组 `lv_array` :
```
DATA: lv_array TYPE TABLE OF i,
lv_target TYPE i.
lv_array = VALUE #( (1) (2) (3) (4) (5) ).
lv_target = 3.
CALL FUNCTION 'binary_search'
EXPORTING
p_values = lv_array
p_target = lv_target.
```
运行代码,会输出目标值的索引位置3。
这是一个简单的ABAP二分查找实现。通过每次比较目标值和数组中间元素的大小关系,可以快速缩小查找范围,提高查找效率。
用C语言写一个二分查找代码
以下是一个示例代码:
```c
#include <stdio.h>
int binarySearch(int arr[], int left, int right, int target) {
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid;
}
if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
int main() {
int arr[] = {1, 3, 5, 7, 9};
int n = sizeof(arr) / sizeof(arr[0]);
int target = 5;
int index = binarySearch(arr, 0, n - 1, target);
if (index == -1) {
printf("Target not found\n");
} else {
printf("Target found at index %d\n", index);
}
return 0;
}
```
解释:
- `binarySearch` 函数实现了二分查找算法,接收一个有序数组 `arr`,以及要查找的目标值 `target`。`left` 和 `right` 参数表示搜索区间的左右边界,一开始分别设置为数组的第一个和最后一个元素的下标。
- 在循环中,计算出中间元素的下标 `mid`,并判断中间元素和目标值的大小关系。
- 如果中间元素等于目标值,直接返回该下标。
- 如果中间元素小于目标值,将左边界更新为 `mid + 1`,继续在右侧查找。
- 如果中间元素大于目标值,将右边界更新为 `mid - 1`,继续在左侧查找。
- 如果没有找到目标值,最终返回 -1。
在 `main` 函数中,创建一个有序数组 `arr`,并调用 `binarySearch` 函数查找目标值 5。如果找到,打印目标值在数组中的下标,否则打印未找到的提示。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)