binSearch的三种形式

1.binSearch比较次数不平衡,一方比较次数比一方比较次数多1,所以可以有所改进,根据改进方向的不同,可以改进为fibonaccian查找(寻找比例的最优值)或者binSearch2(想办法平衡比较次数)
2.binSearch2次数平衡,但却不满足约定,为了满足约定,所以有了binSearch3
3.binSearch3看似有所遗漏,实则精巧,其正确性可以用不变性和单调性证明

#include <iostream>
#include <algorithm>
using namespace std;
int binSearch1(int *a, int e, int lo, int hi){//左闭右开
    while (lo < hi){
        int mi = (lo + hi) >> 1;
        if (e < a[mi])
            hi = mi;
        else if (a[mi] < e)
            lo = mi + 1;
        else return mi;
    }
    return -1;//查找失败
}//有多个命中元素时,不能保证返回秩最大者,查找失败时,只能简单返回-1;
int binSearch2(int *a, int e, int lo, int hi){//左闭右开
    while ( lo + 1 < hi ){
        int mi = (lo + hi) >> 1;
        (e < a[mi]) ? hi = mi : lo = mi;//经比较后确定深入[lo, mi)或[mi, hi)
    }
    return (e == a[lo]) ? lo : -1;//查找成功时返回对应的秩;否则统一返回-1
}//有多个命中元素时,不能保证返回秩最大者,查找失败时,简单地返回 - 1
int binSearch3(int *a, int e, int lo, int hi){//左闭右开
    while (lo < hi){
        int mi = (lo + hi) >> 1;
        (e < a[mi]) ? hi = mi : lo = mi + 1; // 经比较后确定深入[lo, mi)或(mi, hi)
    }
    return --lo;
}//有多个命中元素时,总能保证返回秩最大者;查找失败时,能够返回失败的位置
int main(){
    int a[10] = { 11, 9, 7, 8, 5, 6, 4, 2, 3, 1 };
    sort(a,a+10);
    cout << binSearch1(a, 10, 0, 10) << endl;
    cout << binSearch2(a, 10, 0, 10) << endl;
    cout << binSearch3(a, 10, 0, 10) << endl;
    return 0;
}
### Java 中常见算法类型及其实现 #### 一、字符串处理算法 对于给定的字符串`str="aabb23xx&caaccy#yxx@xyyd5_d4dd"`,可以通过正则表达式去除其中所有的非字母数字下划线字符[^1]。 ```java public class Test { public static void main(String[] args) { String str = "aabb23xx&caaccy#yxx@xyyd5_d4dd"; str = str.replaceAll("[\\W]", ""); System.out.println(str); } } ``` 该程序会输出仅保留字母、数字以及下划线的结果串。这里使用了`\W`来匹配任何不是字母、数字或下划线的Unicode字符,并将其替换为空字符串。 #### 二、查找算法——二分查找法 当面对已排序数组时,可以采用递归方式实现高效的二分查找算法[^3]: ```java public static int binSearch_2(int key, int[] array, int low, int high){ if (key < array[low] || key > array[high] || low > high) { return -1; } int middle = (low + high) / 2; if(array[middle] > key){ return binSearch_2(key, array, low, middle - 1); } else if(array[middle] < key){ return binSearch_2(key, array, middle + 1, high); } else{ return array[middle]; } } ``` 这段代码展示了如何在一个已经升序排列好的整型数组中寻找特定数值的位置;如果找到,则返回对应的索引位置;如果没有找到,则返回-1表示未发现目标值。 #### 三、排序算法——冒泡排序 针对一组无序数据,可运用经典的冒泡排序来进行从小到大的重新排列: ```java for (int i = 0; i < n - 1; ++i) { for (int j = 0; j < n - 1 - i; ++j) { if (array[j] > array[j + 1]) { // swap elements at indices 'j' and 'j+1' temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } ``` 上述伪码描述了一个完整的冒泡排序过程,它通过相邻两两比较并交换的方式逐步使较大的元素向右移动直至整个序列变得有序为止。 #### 四、其他重要概念——动态规划 在解决某些具有重复子结构的问题上,比如最长公共子序列等问题,常常需要用到动态规划这一强大工具[^5]。这种方法能够有效地减少不必要的计算量从而提高效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值