二分法查找升序和降序集合

二分法查找list并进行数据的增删改
系统提供的方法是对升序list或数组进行查找
返回的值>0则代表找到,小于0表示没有找到
如果小于0 那么取反则是数据需要插入的位置
list和数组的查找系统提供的方法为 :

Collections.binarySearch()    
ContainerHelpers.binarySearch()  

public class Test {
    /**
    * 对降序list进行查找
    */
    private static <T>
    int indexedBinarySearch(List<? extends Comparable<? super T>> list, T key) {
        int low = 0;
        int high = list.size()-1;

        while (low <= high) {
            int mid = (low + high) >>> 1;
            Comparable<? super T> midVal = list.get(mid);
            int cmp = midVal.compareTo(key);

            if (cmp < 0)
                high = mid - 1;
            else if (cmp > 0)
                low = mid + 1;
            else
                return mid; // key found
        }
        return -(low + 1);  // key not found
    }

  public static void test() {
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是使用二分法查找降序数组元素的C程序: ```c #include <stdio.h> int binarySearch(int arr[], int low, int high, int key) { while (low <= high) { int mid = (low + high) / 2; if (arr[mid] == key) { return mid; } else if (arr[mid] < key) { high = mid - 1; } else { low = mid + 1; } } return -1; } int main() { int arr[] = {9, 8, 6, 5, 3, 2, 1}; int n = sizeof(arr) / sizeof(arr[0]); int key = 5; int result = binarySearch(arr, 0, n - 1, key); if (result == -1) { printf("元素 %d 不在数组中", key); } else { printf("元素 %d 在数组中的位置是 %d", key, result); } return 0; } ``` 该程序先定义了一个 `binarySearch` 函数,使用二分法查找数组中是否有指定的元素。函数接受四个参数:一个整型数组 `arr`,数组的起始下标 `low`,数组的结束下标 `high` 和要查找的元素 `key`。函数使用一个循环来不断缩小查找范围,最终返回元素在数组中的下标或 -1。 在 `main` 函数中,我们定义了一个降序数组 `arr`,并使用 `sizeof` 函数计算了数组的长度。然后我们指定要查找的元素 `key` 为 5,调用 `binarySearch` 函数进行查找,并根据返回值输出结果。 ### 回答2: 二分法是一种经典的查找算法,可以在有序数组中高效地查找目标元素。对于降序数组,我们可以稍作修改来适应它。 C程序的实现如下: ```c #include <stdio.h> // 定义一个降序数组 int arr[] = {100, 90, 80, 70, 60, 50, 40, 30, 20, 10}; // 二分查找函数 int binarySearch(int target, int left, int right) { while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) { return mid; } if (arr[mid] > target) { left = mid + 1; } else { right = mid - 1; } } return -1; } int main() { int target = 60; int size = sizeof(arr) / sizeof(arr[0]); int result = binarySearch(target, 0, size - 1); if (result != -1) { printf("找到目标元素 %d 在索引位置 %d。\n", target, result); } else { printf("未找到目标元素 %d。\n", target); } return 0; } ``` 上述代码中,我们首先定义了一个降序数组 `arr[]`。接着,我们实现了一个 `binarySearch()` 函数来进行二分查找。该函数接收三个参数:目标元素 `target`、数组的左边界 `left` 和数组的右边界 `right`。 在 `binarySearch()` 函数中,我们使用 `while` 循环来进行二分查找。我们首先计算出中间元素的索引 `mid`,然后将目标元素与中间元素进行比较。如果相等,则返回中间元素的索引。如果目标元素比中间元素小,说明目标元素在右半部分,更新左边界 `left`。反之,更新右边界 `right`。直到左边界大于右边界,表示未找到目标元素,返回 -1。 在主函数中,我们定义了要查找的目标元素 `target`,然后计算出数组的长度 `size`。我们调用 `binarySearch()` 函数,并将目标元素、左边界为 0,右边界为 `size - 1` 传入。最后,根据返回的结果,输出相应的提示信息。 ### 回答3: 下面是用二分法查找一个降序数组的元素的C程序: ```c #include <stdio.h> int binarySearch(int arr[], int target, int left, int right) { while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) { return mid; } else if (arr[mid] > target) { left = mid + 1; } else { right = mid - 1; } } return -1; } int main() { int arr[] = {10, 8, 6, 4, 2, 0}; int target = 6; int size = sizeof(arr) / sizeof(arr[0]); int result = binarySearch(arr, target, 0, size - 1); if (result == -1) { printf("元素 %d 不存在\n", target); } else { printf("元素 %d 在索引位置 %d\n", target, result); } return 0; } ``` 上述代码中,我们定义了一个`binarySearch`函数。在这个函数中,我们用`left`和`right`变量表示当前查找的范围的左右边界。在每次迭代中,我们找到中间位置 `mid`,然后将目标值与中间值进行比较。如果中间值等于目标值,则返回中间位置。如果中间值大于目标值,则缩小查找范围到右半部分(即`left`更新为`mid+1`),如果中间值小于目标值,则缩小查找范围到左半部分(即`right`更新为`mid-1`)。如果循环结束后没有找到目标值,则返回-1。 在主函数中,我们声明了一个降序排列的数组`arr`和要查找的目标值`target`。通过将数组的大小除以数组元素的大小,我们可以得到数组的长度。然后,我们调用`binarySearch`函数来查找目标值在数组中的索引位置。如果返回值为-1,则说明目标值不在数组中,否则,返回值就是目标值的索引位置。最后,我们根据返回值打印相应的结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值