二分查找8005算法c语言,寻找左侧边界的二分查找

寻找左侧边界的二分查找

```

int left_bound(int[] nums, int target) {

if (nums.length == 0) return -1;

int left = 0;

int right = nums.length; // 注意

while (left < right) { // 注意

int mid = left+(right-left)/ 2;//防溢出

if (nums[mid] == target) {

right = mid;

} else if (nums[mid] < target) {

left = mid + 1;

} else if (nums[mid] > target) {

right = mid; // 注意

}

}

return left;

}

```

细节改动与影响:

```

改动1:while (left < right);

此时终止条件为left=right,搜索区间为[left,right)

```

```

改动2:if (nums[mid] == target) {

right = mid;

}

当搜索到target,不急于返回值,而是缩小搜索区间的商界right,在[left,mid)继续搜索,即不断向左侧收缩,以达到锁定左侧边界的目的。

```

```

改动3:else if (nums[mid] > target) {

right = mid; // 注意

}

当搜索到的值比target大时,缩小搜索区间为[left,mid)

```

```

改动4:return left;

为什么要返回left,而不是-1,其实是有意义的。

```

比如给二个数组[1,3,4,5,7,9,9,9,16,19],[1,3,4,5,7,9,11,13,16,19]

用上面的算法做一个图解过程(搜索9为例)

具有重复元素的数组的图解过程:

![](/image_editor_upload/20190824063711_31116.png)

![](/image_editor_upload/20190824063725_76087.png)

![](/image_editor_upload/20190824063757_70143.png)

![](/image_editor_upload/20190824063807_94498.png)

![](/image_editor_upload/20190824063816_46593.png)

不具有重复元素的数组的图解过程(同上,只是6,7位的元素不同而已)

```

此时返回值为5,说明比索引的数小的数有5个。如果搜索16的话,则会返回8,说明之前有8个数小于16.

这样又会有一个问题,如果搜索8的话,返回值为5,但是数组有没有这个数,该怎么办?

那就加一段补丁:

......

if(left==nums.length)reutrn -1;

return nums[left]==target?left:-1;

```

寻找右侧边界的二分搜索同理

应用变种:

1.查找第一个值等于目标值的元素或位置(左侧边界)

2.查找最后一个值等于目标值的元素或位置(右侧边界)

3.查找第一个大于等于目标值的元素(右侧边界)

4.查找最后一个小于等于目标值的元素(左侧边界)

适用环境:

1.适用于一次排序多次查找的场景中。

2.适用于单次比较非常耗时,需尽量减少比较次数的场景。

3.不适用于数据量太大的场景,因为二分查找需要连续内存。

0.0分

2 人评分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法。 好的,二分查找算法可以用C语言来实现,具体的步骤如下: 1. 首先,确定要查找的数组的范围,以及要查找的目标值。 2. 定义左右边界,即数组的最左侧和最右侧的位置。 3. 进入循环,在循环中判断左边界是否小于等于右边界,如果是,则执行以下操作: 1) 计算中间元素的位置,即左右边界之和除以2 2) 如果目标值等于中间元素的值,则直接返回中间元素的位置。 3) 如果目标值小于中间元素的值,则在左半部分继续查找,将右边界更新为中间元素的位置减1。 4) 如果目标值大于中间元素的值,则在右半部分继续查找,将左边界更新为中间元素的位置加1。 4. 如果没有找到目标值,则返回一个特定的值来表示找不到。 下面是 C 语言实现的二分查找算法代码: ```c #include <stdio.h> int binarySearch(int arr[], int low, int high, int target) { while (low <= high) { int mid = (low + high) / 2; if (arr[mid] == target) { return mid; } else if (arr[mid] < target) { low = mid + 1; } else { high = mid - 1; } } return -1; } int main() { int arr[] = {1, 3, 5, 7, 9, 11, 13, 15}; int n = sizeof(arr) / sizeof(arr[0]); int target = 7; int result = binarySearch(arr, 0, n - 1, target); if (result == -1) { printf("Element not found\n"); } else { printf("Element found at index %d\n", result); } return 0; } ``` 希望这个代码能够帮助你了解如何用C语言实现二分查找算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值