写出二分法查找的代码(arr为按升序排列的数组,key为待查找的元素,n为数组长度,返回值为key所在的元素的下标,未找到返回-1)(搜索算法)备注:int binary_search(int *arr, int key, int n)
时间: 2024-03-28 20:41:28 浏览: 56
好的,这是二分查找的代码实现:
```
int binary_search(int *arr, int key, int n) {
int left = 0;
int right = n - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == key) {
return mid;
} else if (arr[mid] < key) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
```
二分法查找是一种高效的查找算法,它的时间复杂度为O(logn)。在每次比较的时候,都可以将查找区间缩小一半,直到找到或者区间为空。
相关问题
二分法插入 void BiInsertion(int a[],int n,int type)输入乱序的数组,通过二分法排序算法将其按升序排列。 预期输入:321
好的,这是一个经典的排序问题。我可以给你一个简单的二分法插入排序算法,可以将输入的乱序数组按升序排列。具体步骤如下:
1. 首先,定义一个函数 BiInsertion,它接受一个数组 a,数组长度 n 和排序类型 type(1 表示升序,-1 表示降序)作为输入参数。
2. 然后,从数组的第二个元素开始,依次将每个元素插入到已排好序的子数组中。
3. 对于第 i 个元素,使用二分查找在已排好序的子数组中找到它应该插入的位置 j。
4. 然后,将第 i 个元素插入到位置 j 上,并将位置 j 及之后的元素依次后移一位。
5. 最后,将第 i 个元素插入到位置 j 上,完成第 i 轮插入排序。
下面是代码实现:
```
void BiInsertion(int a[], int n, int type) {
for (int i = 1; i < n; i++) {
int left = 0, right = i - 1;
int key = a[i];
while (left <= right) {
int mid = (left + right) / 2;
if (type * a[mid] > type * key) {
right = mid - 1;
} else {
left = mid + 1;
}
}
for (int j = i - 1; j >= left; j--) {
a[j + 1] = a[j];
}
a[left] = key;
}
}
```
这样,你就可以用 BiInsertion 函数将输入的乱序数组按升序排列了。
二分法查找返回关键值key在长度为len的数组arr[]中的位置,没有key则返回-1 int bi_search(int key,int arr[],int len)
二分法查找是一种在有序数组中查找特定元素的高效算法。其基本思想是将数组分成两半,通过比较中间元素与目标值的大小,确定目标值所在的那一半,然后继续在那一半数组中查找,直到找到目标值或者确定目标值不存在于数组中。
下面是用C语言实现的二分查找函数:
```c
int bi_search(int key, int arr[], int len) {
int low = 0;
int high = len - 1;
int mid;
while (low <= high) {
mid = low + (high - low) / 2; // 防止溢出的写法
if (arr[mid] == key) {
return mid; // 找到key,返回其位置索引
} else if (arr[mid] < key) {
low = mid + 1; // 如果中间值小于key,则在右侧子数组中查找
} else {
high = mid - 1; // 如果中间值大于key,则在左侧子数组中查找
}
}
return -1; // 如果没有找到key,返回-1
}
```
二分查找的前提是数组必须是有序的。如果数组未排序,则无法使用二分查找。这个函数在数组中查找给定的关键值`key`,如果找到则返回其在数组中的位置索引,否则返回-1。
阅读全文