)假设所有的关键字都采用“从大到小”排序,试对函数 BinarySearch()进行改写,从 而同样实现二分查找功能。
时间: 2024-05-04 10:19:03 浏览: 8
以下是改写后的 BinarySearch() 函数代码:
```
int BinarySearch(int arr[], int n, int key) {
int left = 0, right = n - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == key) {
return mid;
} else if (arr[mid] > key) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return -1;
}
```
与传统的二分查找相比,这个函数只是改变了比较大小的方式,从而达到了“从大到小”排序的目的。
相关问题
c++如何对opencv绘制出来的轮廓按照从大到小的顺序排序?
可以使用`cv::findContours()`函数来找到轮廓,并将其存储在一个向量中。然后,可以使用`std::sort()`函数对这个向量进行排序,按照每个轮廓的面积从大到小的顺序进行排序。
以下是一个示例代码:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
using namespace cv;
using namespace std;
bool compareContourAreas(vector<Point> contour1, vector<Point> contour2) {
double i = fabs(contourArea(Mat(contour1)));
double j = fabs(contourArea(Mat(contour2)));
return (i > j);
}
int main() {
Mat img = imread("path/to/image.jpg");
Mat gray, binary;
cvtColor(img, gray, COLOR_BGR2GRAY);
threshold(gray, binary, 100, 255, THRESH_BINARY);
vector<vector<Point>> contours;
findContours(binary, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
sort(contours.begin(), contours.end(), compareContourAreas);
for (size_t i = 0; i < contours.size(); i++) {
drawContours(img, contours, i, Scalar(0, 0, 255), 2);
}
imshow("Contours", img);
waitKey(0);
return 0;
}
```
在这个示例中,我们首先使用`cv::findContours()`函数找到图像中的所有轮廓,并将它们存储在一个向量中。然后,我们定义了一个`compareContourAreas`函数,该函数用于比较两个轮廓的面积,并返回一个布尔值,以指示哪个轮廓的面积更大。最后,我们使用`std::sort()`函数对轮廓向量进行排序,按照面积从大到小的顺序进行排序。
最后,我们使用`cv::drawContours()`函数将排序后的轮廓绘制在原始图像上。
本题要求实现两个函数:(1)排序;(2)二分查找 先利用排序算法将数据按关键字从小到
大排序,然后再利用二分查找算法在已排序的数据中查找给定的关键字。
排序算法可以选择冒泡排序、插入排序、选择排序、快速排序等等,具体实现可以根据数据规模和特点来选择。
二分查找算法可以按照以下步骤进行实现:
1. 首先确定查找的范围,即最小值和最大值的下标。
2. 然后计算中间值的下标,如果中间值等于要查找的值,则直接返回中间值下标。
3. 如果中间值大于要查找的值,则在左半部分继续查找;如果中间值小于要查找的值,则在右半部分继续查找。
4. 不断重复步骤2和步骤3,直到找到要查找的值或者查找范围缩小到只有一个元素为止,如果最终没有找到要查找的值,则返回-1或者其他特定的值。
下面是一个简单的实现示例(以排序和查找整型数组为例):
```python
def sort_array(arr):
# 使用Python内置的排序函数进行排序
arr.sort()
def binary_search(arr, key):
# 确定查找范围
left, right = 0, len(arr) - 1
while left <= right:
# 计算中间值的下标
mid = (left + right) // 2
if arr[mid] == key:
# 找到了要查找的值
return mid
elif arr[mid] < key:
# 在右半部分继续查找
left = mid + 1
else:
# 在左半部分继续查找
right = mid - 1
# 没有找到要查找的值
return -1
```
使用示例:
```python
# 测试排序函数
arr = [3, 1, 4, 2, 5]
sort_array(arr)
print(arr) # 输出 [1, 2, 3, 4, 5]
# 测试查找函数
index = binary_search(arr, 3)
print(index) # 输出 2
```
注意:以上实现只是一个简单示例,实际应用中需要考虑更多细节和异常情况的处理。
相关推荐
![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)