int BinarySearch(int array[], int key, int min, int max)采用二分查找实现key的查找
时间: 2023-12-14 07:03:33 浏览: 75
这是一个实现二分查找的函数,其参数包括一个已排序的数组array、要查找的值key、查找范围的最小下标min和最大下标max。该函数会在数组中查找key,并返回其下标,如果未找到则返回-1。
具体实现过程如下:
1. 将查找范围的最小下标min和最大下标max计算出中间值mid。
2. 如果mid对应的值等于key,则返回mid。
3. 如果mid对应的值大于key,则在左半部分继续查找,即将max更新为mid-1,重新计算mid并跳到步骤1。
4. 如果mid对应的值小于key,则在右半部分继续查找,即将min更新为mid+1,重新计算mid并跳到步骤1。
5. 如果min大于max,则说明key不存在于数组中,返回-1。
示例代码如下:
```
int BinarySearch(int array[], int key, int min, int max) {
while (min <= max) {
int mid = (min + max) / 2;
if (array[mid] == key) {
return mid;
} else if (array[mid] > key) {
max = mid - 1;
} else {
min = mid + 1;
}
}
return -1;
}
```
相关问题
定义一最大长度为20的结构体数组,分别用插入排序、选择排序、冒泡排序、递归的快速排序方法完成,再用折半查找方法对已经有序的结构体数组进行操作
好的,我来回答你的问题。
首先,这是一个定义结构体数组的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 20
struct Student {
int id;
char name[20];
float score;
};
struct Student students[MAX_LEN];
```
接下来,我会分别介绍插入排序、选择排序、冒泡排序、快速排序和折半查找的实现方法。
1. 插入排序
插入排序的思路是,将未排序的元素插入到已排序的子序列中。具体实现方法可以参考下面的代码:
```c
void insertion_sort(struct Student array[], int len) {
int i, j;
struct Student temp;
for (i = 1; i < len; i++) {
temp = array[i];
j = i - 1;
while (j >= 0 && array[j].id > temp.id) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = temp;
}
}
```
2. 选择排序
选择排序的思路是,每次选出未排序中的最小元素,将其放到已排序的末尾。具体实现方法可以参考下面的代码:
```c
void selection_sort(struct Student array[], int len) {
int i, j, min_index;
struct Student temp;
for (i = 0; i < len - 1; i++) {
min_index = i;
for (j = i + 1; j < len; j++) {
if (array[j].id < array[min_index].id) {
min_index = j;
}
}
if (min_index != i) {
temp = array[i];
array[i] = array[min_index];
array[min_index] = temp;
}
}
}
```
3. 冒泡排序
冒泡排序的思路是,每次比较相邻的两个元素,如果它们的顺序不对就交换它们。具体实现方法可以参考下面的代码:
```c
void bubble_sort(struct Student array[], int len) {
int i, j;
struct Student temp;
for (i = 0; i < len - 1; i++) {
for (j = 0; j < len - i - 1; j++) {
if (array[j].id > array[j + 1].id) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
```
4. 快速排序
快速排序的思路是,选择一个基准元素,将小于它的元素放到左边,大于它的元素放到右边,再对左右两个子序列分别进行快速排序。具体实现方法可以参考下面的代码:
```c
void quick_sort(struct Student array[], int left, int right) {
int i, j;
struct Student pivot, temp;
if (left < right) {
pivot = array[left];
i = left;
j = right;
while (i < j) {
while (i < j && array[j].id >= pivot.id) {
j--;
}
if (i < j) {
array[i] = array[j];
i++;
}
while (i < j && array[i].id < pivot.id) {
i++;
}
if (i < j) {
array[j] = array[i];
j--;
}
}
array[i] = pivot;
quick_sort(array, left, i - 1);
quick_sort(array, i + 1, right);
}
}
```
5. 折半查找
折半查找的思路是,将已排序的序列分成两半,如果要查找的元素比中间元素小就在左半部分继续查找,否则在右半部分继续查找。具体实现方法可以参考下面的代码:
```c
int binary_search(struct Student array[], int len, int key) {
int left = 0;
int right = len - 1;
int mid;
while (left <= right) {
mid = (left + right) / 2;
if (array[mid].id == key) {
return mid;
} else if (array[mid].id < key) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
```
最后,你可以将这些函数组合起来,实现一个完整的程序。需要注意的是,在使用折半查找之前,需要先对数组进行排序。
阅读全文