解释这段代码:int BSearchFirstGreater(int left, int right, int value){ int l = left; while(left<=right){ int mid = (right-left)/2+left; if(array[mid]>=value){ if(mid==l || array[mid-1]<value) return mid; else right = mid-1; }else left = mid+1; } return -1; }
时间: 2024-02-04 14:03:47 浏览: 33
这段代码实现了一个二分查找函数BSearchFirstGreater,它的作用是在已经排序好的数组array中查找第一个大于等于value的元素的下标,如果没有找到,则返回-1。
函数的实现方式与标准的二分查找类似,也是通过while循环来实现二分查找。首先设定左边界为left,然后在循环中,计算中间位置mid。如果array[mid]>=value,则说明要查找的元素在左半部分,此时判断array[mid]是否是第一个大于等于value的元素,如果是,则返回mid;否则,将右边界设为mid-1继续查找。如果array[mid]<value,则要查找的元素在右半部分,此时将左边界设为mid+1继续查找。如果最终没有找到符合条件的元素,则返回-1。
需要注意的是,在判断array[mid]是否是第一个大于等于value的元素时,需要判断mid是否等于left,如果是,则说明array[mid]就是第一个大于等于value的元素;否则,还需要判断array[mid-1]是否小于value,如果是,则说明array[mid]是第一个大于等于value的元素;否则,需要继续在左半部分查找。
函数的参数有三个,分别是数组的左右边界和要查找的值value。代码实现简洁明了,易于理解,可以用于各种需要查找第一个大于等于某个值的情况。
相关问题
修改这段代码,实现查找第一个大于value的元素的下标:int BSearch(int l, int r, long long value) { int left = l; while (l <= r) { mid = (r - l) / 2 + l; if (a[mid] >= value) { if (mid == left || a[mid - 1] < value) { return mid; } else r = mid - 1; } else { l = mid + 1; } } return -1; }
这是一个修改后的二分查找函数BSearch,实现的是查找第一个大于value的元素的下标。
函数的实现方式与原来的函数类似,也是通过while循环来实现二分查找。首先设定左边界为l,然后在循环中,如果a[mid] >= value,则说明要查找的元素在左半部分,此时判断a[mid]是否是第一个大于等于value的元素,如果是,则返回mid;否则,将右边界设为mid-1继续查找。如果a[mid] < value,则要查找的元素在右半部分,此时将左边界设为mid+1继续查找。如果最终没有找到符合条件的元素,则返回-1。
需要注意的是,在判断a[mid]是否是第一个大于等于value的元素时,需要判断mid是否等于left,如果是,则说明a[mid]就是第一个大于等于value的元素;否则,还需要判断a[mid-1]是否小于value,如果是,则说明a[mid]是第一个大于等于value的元素;否则,需要继续在左半部分查找。
修改后的代码如下:
```
int BSearch(int l, int r, long long value) {
int left = l;
while (l <= r) {
mid = (r - l) / 2 + l;
if (a[mid] >= value) {
if (mid == left || a[mid - 1] < value) {
return mid;
} else {
r = mid - 1;
}
} else {
l = mid + 1;
}
}
return -1;
}
```
int SearchByroom(struct student stu[],int n,int value) { int left = 0, right = n - 1; while (left <= right) { int mid = (left + right) / 2; if (stu[mid].room == value) { return mid; } else if (stu[mid].room > value) { right = mid-1; } else { left = mid+1; } } return -1; }能显示同一个宿舍的所有人
这段代码实现了二分查找算法,在数组stu中查找宿舍号为value的学生信息,并返回该学生信息在数组中的下标位置。若未找到,则返回-1。
如果您需要显示同一个宿舍的所有人,可以在找到第一个宿舍号为value的学生信息后,继续向左和向右查找宿舍号为value的学生信息,直到找到最后一个宿舍号为value的学生信息。具体实现方法如下:
```c
int SearchByroom(struct student stu[], int n, int value) {
int left = 0, right = n - 1;
int first = -1, last = -1; // 记录第一个和最后一个宿舍号为value的学生信息的下标位置
while (left <= right) {
int mid = (left + right) / 2;
if (stu[mid].room == value) {
if (first == -1) {
first = mid; // 找到第一个宿舍号为value的学生信息
}
else {
last = mid; // 找到最后一个宿舍号为value的学生信息
}
}
if (stu[mid].room >= value) {
right = mid - 1;
}
else {
left = mid + 1;
}
}
if (first == -1) {
return -1; // 没有找到宿舍号为value的学生信息
}
printf("宿舍号为%d的学生信息如下:\n", value);
for (int i = first; i <= last; i++) {
printf("姓名:%s,学号:%s,宿舍号:%d\n", stu[i].name, stu[i].id, stu[i].room);
}
return first; // 返回第一个宿舍号为value的学生信息的下标位置
}
```
这样,当SearchByroom函数返回值不为-1时,就可以输出同一个宿舍的所有人的信息了。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.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)