二分法很简单吧 ,但要想 一次写对 也不容易吧 ,更何况他的一些扩展应用呢 ,我这里扩展了四种,基础知识 还是牢靠的好
/**
* Author: yiminghe
* Date: 2008-10-13
* Time: 23:50:48
* Any problem ,contact yiminghe@fudan.edu.cn.
*/
public class BinarySearch {
//返回中间一个数
//12345666689
// 6 不确定返回哪个6
public static int b1(int[] array, int v) {
int left = 0;
int right = array.length - 1;
while (left <= right) {
int middle = (left + right) / 2;
if (array[middle] == v) return middle;
if (array[middle] > v)
right = middle - 1;
else
left = middle + 1;
}
return -1;
}
//返回重复元素的最后一个数
//123456667
//最后一个6位置返回
public static int b2(int[] array, int v) {
int left = 0;
int right = array.length - 1;
while (left < right) {
int middle = (left + right + 1) / 2;
if (array[middle] > v)
right = middle - 1;
else
left = middle;
}
if (array[left] == v)
return left;
return -1;
}
//返回重复元素的最前一个数
//123456667
//最前一个6位置返回
public static int b3(int[] array, int v) {
int left = 0;
int right = array.length - 1;
while (left < right) {
int middle = (left + right) / 2;
if (array[middle] < v)
left = middle + 1;
else
right = middle;
}
if (array[right] == v)
return right;
return -1;
}
//返回重复元素的最前一个数
//1234566689
//最前一个6位置返回 ,若找不到,显示 比他小的离它最大位置,比它小的离它最小位置
//如 找 7 ,则 输出 最后一个6的位置 和 8 的位置
public static int b4(int[] array, int v, int flag) {
int left = 0;
int right = array.length - 1;
while (left < right) {
int middle = (left + right) / 2;
if (array[middle] < v)
left = middle + 1;
else
right = middle;
}
if (array[right] == v)
return right;
System.out.println(right - 1 + " -- " + left);
return -1;
}
public static void main(String[] args) {
// 0, 1, 2, 3 4 5 6 7
int[] array = new int[]{1, 2, 3, 4, 10, 16, 16, 16, 16, 16, 16, 18, 110};
//array = new int[]{0, 6};
//array = new int[]{6, 7};
System.out.println(b1(array, 16));
System.out.println(b2(array, 16));
System.out.println(b3(array, 16));
System.out.println(b4(array, 6, 1));
}
}
分享到:
相关推荐
二分法,又称折半搜索或二进制搜索,是一种在有序数组中查找特定元素的...在给定的"二分法"文件中,可能包含了关于二分法的详细解释、实例代码或者相关习题,对学习者而言,这些资源无疑能加深对二分法的理解和应用。
本文将详细介绍 Matlab 中的二分法求零点方法,并提供实例代码和结果分析。 二分法的定义 二分法是一种迭代方法,用于求解非线性方程的零点。该方法的基本思想是:将搜索区间不断地二分,直到找到零点所在的区间,...
### 二、实例分析 #### 2.1 方程\(2x = 4 - x\)的近似解 - **过程**: 1. **确定函数**:设函数\(f(x) = 2x + x - 4\)。 2. **验证区间**:因为\(f(0) = -3 ),\(f(2) = 2 > 0\),所以函数\(f(x)\)在区间\((0,2)\...
此外,还提到了**Brent方法**,它是二分法的扩展,结合了逆二次插值以提高效率。R语言中的`uniroot`函数就是采用Brent方法来寻找一元方程的根。 总结来说,这个PPT教程深入浅出地介绍了数值优化的基础知识,包括...
首先,我们可以将问题简化为n=2的情况,即四个队伍的比赛,然后逐步扩展到更大的规模。通过观察,我们可以发现每个规模的解决方案可以通过上一规模的解决方案生成。例如,从2个队伍的竞赛(12,21)可以构建4个队伍...
15. 二分法检索:对顺序存储并已排序的线性表进行二分法检索,可以高效定位目标元素。 16. 常量声明:在某些编程语言中,如Visual Basic,`Const A1%=60000`是正确声明一个整型常量的语法。 17. 数据查找:在...
3. **非线性方程的迭代法**:这可能指的是各种改进或扩展的迭代法,如Secant法(赛康法)或Householder法等,它们用于寻找非线性方程的根。这些方法通常结合了多项式插值或线性逼近的思想,以提高收敛速度。 4. **...
复化辛卜生公式则是将这种方法扩展到更细的子区间,通常可以得到更高的精度。 2. **二分法**:二分法(Bisection Method)是寻找实数根的一种基础迭代算法。它适用于连续函数,通过不断将函数零点所在的区间...
8.5.2 二分法查找 128 8.5.3 使用array_search函数进行查找 129 8.5.4 线性表的入栈与出栈 129 8.5.5 数组的合并 131 8.5.6 数组的拆分 133 8.5.7 随机排序 134 8.6 小结 135 第9章 PHP程序调试 136 9.1 PHP中的错误...
此外,作者还将这些理论结果扩展到了时间尺度上,这是对传统连续时间模型的一个扩展,使得研究更具一般性,能够适应更广泛的情况。论文最后通过一个实例验证了所得到的结果的有效性,进一步证明了这种方法的实用价值...
“ch7”这个压缩包文件很可能包含了一章关于非线性方程和方程组求解的详细讲解,可能涵盖了上述方法的理论介绍、算法实现以及实例分析。通过学习这部分内容,读者可以深入理解这些方法的原理,掌握如何在实际问题中...
牛顿迭代法不仅适用于单变量函数,还可以扩展到多变量系统中。 ### 多变量牛顿迭代法 对于含有多个未知数的非线性方程组,例如: \[ F(x) = 0 \] 其中\( F(x) = (f_1(x), f_2(x), \ldots, f_n(x))^T \)且\( x = (x...
1. **二分法检索**:二分法检索是在线性表已按关键码值排序的情况下,通过比较中间元素与目标值来快速定位的一种高效搜索算法。它将搜索区间不断减半,直到找到目标值或确定不存在为止。 2. **Python字典转列表**:...
【算法概念解析】 ...综上所述,算法是高中数学中的关键概念,通过实例分析和问题解决,学生不仅能掌握算法的基本定义,还能锻炼逻辑思维和问题解决能力,为未来深入学习计算机科学和其他相关领域打下坚实基础。
广义表表示则是二叉树的一种扩展,用于表示更复杂的数据结构。 “优先队列”是另一个关键概念,体现在04.3 优先队列 例4.4 进程按优先级调度管理中。优先队列是一种特殊的队列,其中元素按照优先级进行排序。在操作...
例如,用C语言的结构体数组可以实现一个线性结构,将每个学生的信息存储为一个结构体实例。 课程深入讲解了各种具体的数据结构,如线性表、栈、队列、串、数组、广义表、树和图。线性表是最基础的结构,可以采用...
随机数生成是数值模拟的关键,本书会讲解如何在C语言中生成均匀分布的随机数,并扩展到其他概率分布,如正态分布、泊松分布等。此外,求根与线性方程组的章节可能会介绍牛顿法、二分法和拟牛顿法等,这些都是解决非...
- **继承性**:允许创建子类来扩展或修改现有数学对象的功能。 - **多态性**:通过接口或抽象类实现,允许不同类型的数学对象使用相同的接口。 #### 2. **数学对象的实现** - **向量和矩阵类**:实现基本的线性...