折半查找。定义一个函数,实现数组元素的折半查找,函数首部定义形式如下: 函数首部:int find_binary(int arr[], int target) 函数功能:在数组中查找元素target,返回下标;如果找不到,返回-1。
时间: 2025-01-05 13:44:31 浏览: 4
折半查找,也称为二分查找,是一种在有序数组中查找特定元素的高效算法。其基本思想是每次比较目标值与数组中间元素,然后根据比较结果决定是在数组的左半部分还是右半部分继续搜索。以下是`find_binary`函数的实现:
```c++
int find_binary(int arr[], int target) {
int left = 0;
int right = sizeof(arr) - 1; // 获取数组长度减一
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid; // 找到目标元素,返回其索引
} else if (arr[mid] < target) {
left = mid + 1; // 目标在右侧,缩小左侧边界
} else {
right = mid - 1; // 目标在左侧,缩小右侧边界
}
}
return -1; // 没有找到目标元素,返回-1
}
相关问题
c语言程序设计基础,求解答一下编程实现:现有一个数组,数组元素为33,15,58,26,7,49,要求输入一个数,用折半查找找出该数是数组中的第几个元素的值;如果该数不在数组中,则输出“无此数”。提示:先排序,再折半查找。
在C语言中,你可以通过以下步骤实现这个功能:
1. **数组排序**:首先对给定的整数数组进行排序。可以使用`qsort()`函数,它是标准库中的快速排序算法。将数组传递给这个函数,并提供比较函数,以便按照升序排列。
```c
#include <stdio.h>
#include <stdlib.h>
// 比较函数,用于快速排序
int compare(const void* a, const void* b) {
return (*(int*)a - *(int*)b);
}
void sort_array(int arr[], int n) {
qsort(arr, n, sizeof(int), compare);
}
```
2. **折半查找**:然后实现折半查找算法。这里是一个递归版本的二分查找:
```c
int binary_search(int arr[], int left, int right, int target) {
if (right >= left) {
int mid = left + (right - left) / 2;
// 如果中间值等于目标,返回索引
if (arr[mid] == target)
return mid;
// 如果中间值大于目标,搜索左半部分
else if (arr[mid] > target)
return binary_search(arr, left, mid - 1, target);
// 否则,搜索右半部分
else
return binary_search(arr, mid + 1, right, target);
}
// 目标不存在于数组中
return -1;
}
```
3. **主程序**:最后,在主函数中获取用户输入、调用排序函数并进行查找。
```c
int main() {
int arr[] = {33, 15, 58, 26, 7, 49};
int n = sizeof(arr) / sizeof(arr[0]);
sort_array(arr, n);
int input;
printf("请输入一个数:");
scanf("%d", &input);
int index = binary_search(arr, 0, n - 1, input);
if (index != -1)
printf("该数在数组中的位置为 %d\n", index + 1);
else
printf("无此数。\n");
return 0;
}
```
运行这个程序时,输入一个数字,它会告诉你在排序后的数组中它的位置,如果没有找到则显示"无此数"。注意,由于数组下标从0开始,所以在输出结果时需要加上1。
用C语言创建一个待查找的数组: 8,22,33,45,99;调用顺序查找函数在上述数组中查找元素45所在的位置,调用折半查找函数在上述数组中查找元素99所在的位置,并将结果输出。
在C语言中,你可以通过以下步骤创建一个动态数组并分别实现顺序查找和折半查找:
首先,我们需要创建一个动态数组,这里我们假设数组大小固定为5,且已经包含了给定的元素:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义数组结构体
typedef struct {
int value;
int index;
} Element;
// 动态数组
Element array[] = { {8, 0}, {22, 1}, {33, 2}, {45, 3}, {99, 4} };
const int size = sizeof(array) / sizeof(array[0]);
// 顺序查找函数
int sequential_search(int target, Element arr[], int n) {
for (int i = 0; i < n; ++i) {
if (arr[i].value == target)
return arr[i].index;
}
return -1; // 如果找不到目标,返回-1表示未找到
}
// 折半查找函数(二分查找,适用于已排序数组)
int binary_search(int target, Element arr[], int n) {
int left = 0, right = n - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid].value == target)
return arr[mid].index;
else if (arr[mid].value < target)
left = mid + 1;
else
right = mid - 1;
}
return -1; // 同样找不到目标,返回-1
}
int main() {
printf("顺序查找45的位置: %d\n", sequential_search(45, array, size));
printf("折半查找99的位置: %d\n", binary_search(99, array, size));
return 0;
}
```
当你运行这个程序,它会输出顺序查找45时的结果(因为45在第三个位置),以及折半查找99的结果(因为99在最后一个位置)。注意,为了进行二分查找,数组需要按升序排列。这里是已排序好的数组。
阅读全文