`

重走算法路之二分查找

阅读更多

        今天读“谷歌三大论文”看到了“二分查找”这个词,突然一点印象都没有了,记性是被狗吃去了么,最主要的是平时用的少,又没怎么去看他,快点打开书,又看了一遍,再敲了一遍,写点东西,算是再次复习一下。

       所谓“二分查找”从字面就可以知道他的意思,一个是“”一个就是“”,“分”就是指把“分数据”“找”也就是找数据,唉,又废话了。

       具体一个例子,我们要在数组中找一个数据,我们先找到中间的值,然后把要找的数据和中间值进行比较,如过比中间值大,我们就知道要在中间和最末尾之间去找了,反之在头和中间里面找。这样就去掉了一半的数据,再这样一直下去,一直分,一直找。。。当头下标比尾下标还要大的时候,也就不能再分了,如果还没找到,就说明数据不在里面。

       一直分,一直找,动作都是一样的,这里我们的“递归”就要出场了,递归也就是自己调用自己。正好符合。“二分查找”就应用到了递归的思想。还要注意的是,能进行“二分查找”对数据是要有要求的。要求就是他们要有序,想想也知道,不然根本就查不到。因此我们在插入数据的时候就要将数据排好序。也就是下面的的insertSorted();方法

        下面上代码,注释应该有那么清楚吧:

         

package 二分查找法;

public class BinarySearch {
	private long[] arr;
	private int nElem;
	
	/*
	 * 构造函数初始化数组和元素个数
	 */
	public BinarySearch(int max) {
		arr = new long[max];
		nElem = 0;
	}

	/*
	 * 得到数组中的元素个数
	 */
	public int getSize() {
		return nElem;
	}
	
	/*
	 * 找到相应的元素的方法
	 */
	public long find(long keySearch) {
		return binarySearch( keySearch,0,nElem-1);
	}

	/*
	 * 二分查找的方法
	 */
	private long binarySearch(long keySearch, int head, int end ) {
		int mid = (head+end)/2;          //找到中间的位置
		if(arr[mid]==keySearch) {        //要找的数据在数组的中间位置
			return mid;                  //返回下标
		}
		else if(head > end) {            //头到尾后面去了,说明没找到
			return nElem;                
		}
		
		else{                           //递归调用
			if(keySearch < arr[mid]) {  //要查找的值比中间值小
			  return binarySearch(keySearch, head, mid-1);   //说明要找的在head--mid-1之间
			}
			else 
			  return binarySearch(keySearch, mid+1, end);   //要找的数据比中间值要大,数据在mid+1--end之间
		}
	}
	
	/*
	 * 在数组中插入一个元素,由于二分查找法针对的是已经排好序的数据,
	 * 所以在构造数组的时候就要使数组中的元素是有序的。
	 */
	public void insertSorted(long value) { 
		int j;
		for(j = 0; j < nElem; j++) {  
			if(arr[j]>value)          //如果要插入的值在中间,跳出循环,转到下一步
				break;
		}
		for(int k = nElem; k > j;k--) {  //将数据往后面移动一个位置
			arr[k] = arr[k-1];
		}
		arr[j] = value;                 //将新的数据放在正确的位置
		nElem ++;                       //元素数量加1
	}
	
	/*
	 * 打印出数组中的每一个元素
	 */
	public void display() {
		for(int i = 0; i < nElem; i++) {
			System.out.print("arr["+i+"]="+arr[i]+" ");
		}
	}
	
	public static void main(String[] args) {
		BinarySearch bs = new BinarySearch(20);
		bs.insertSorted(23);
		bs.insertSorted(5);
		bs.insertSorted(2);
		bs.insertSorted(13);
		bs.insertSorted(230);
		bs.insertSorted(30);
		bs.insertSorted(123);
		bs.insertSorted(53);
		bs.insertSorted(32);
		bs.insertSorted(163);
		bs.insertSorted(2930);
		bs.insertSorted(350);
		
		System.out.println("打印出数组中的数据:");
		bs.display();
		System.out.println();
		System.out.println("元素的个数为:"+bs.getSize());
		
		int keysearch = 163;
		long value = bs.find(keysearch);
		System.out.println("要查找的数为:"+keysearch+" 位置为:"+value);
		
	}

}

   

    打印结果:

    

打印出数组中的数据:
arr[0]=2 arr[1]=5 arr[2]=13 arr[3]=23 arr[4]=30 arr[5]=32 arr[6]=53 arr[7]=123 arr[8]=163 arr[9]=230 arr[10]=350 arr[11]=2930 
元素的个数为:12
要查找的数为:163 位置为:8

    

 

3
0
分享到:
评论

相关推荐

    算法设计与分析-常用算法

    递归分治算法的应用广泛,如快速排序、归并排序、二分查找等。在实际应用中,递归分治法的关键在于正确地确定问题的分解方式和递归的边界条件。 #### 四、回溯法 回溯法是一种通过试探性地解决问题的各个部分来...

    详细的常用算法及其代码,ACM比赛算法

    5. **搜寻算法**:包括循序搜寻、二分搜寻、插补搜寻和费氏搜寻,它们用于在数组或列表中查找特定元素。 6. **集合问题**:如约瑟夫问题(Josephus Problem),涉及到从一个循环列表中按特定规则删除元素,直到只...

    c++算法大全.rar

    8. **二分搜索法**:这是一种在有序数组中查找特定元素的搜索算法。它通过不断将搜索区间减半,快速定位到目标值。二分搜索法广泛应用于排序后的数据处理,如查找、插入和删除操作。 以上这些算法在实际的编程项目...

    C语言 经典算法 算法大全

    16. 搜索算法:如顺序搜索、二分搜索、插补搜索、斐波那契搜索,用于在数据结构中查找特定元素。 17. 稀疏矩阵(Sparse Matrix):处理大量零元素的矩阵,采用压缩存储,提高存储效率和运算速度。 以上只是列举了...

    麻省理工学院-算法导论(重传)

    4. **排序与搜索算法**:如快速排序、归并排序、堆排序、二分查找等,是算法导论中的基本主题。这些算法的原理、实现及其优缺点是学习的重点。 5. **图算法**:包括最短路径算法(如Dijkstra算法、Floyd-Warshall...

    经典算法50例

    - **搜索算法**: 如循序搜寻、二分搜寻、插补搜寻、费氏搜寻等,这些算法用于在一维数据结构中查找特定值的位置。 - **矩阵操作**: 包括稀疏矩阵、多维矩阵转一维矩阵、特殊矩阵(如上三角矩阵、下三角矩阵、对称...

    常用算法程序集(C语言描述)

    - 二分查找:适用于有序数组,每次比较中间元素,缩小搜索范围,时间复杂度为O(log n)。 - 哈希查找:通过哈希函数快速定位目标元素,理想情况下时间复杂度为O(1)。 3. 图形算法: - 广度优先搜索(BFS):从起点...

    经典算法大全

    12. 二分搜寻法:二分搜寻法是一种在有序数组中查找特定元素的高效算法。它通过将数组分成两部分,与要查找的元素进行比较,从而缩小搜索范围。 13. 循序搜寻法与二分搜寻法:循序搜寻法是简单的线性查找,而二分...

    Java常见100多种算法大全

    - **二分查找**:在已排序的数组中,通过不断缩小查找范围找到目标元素,适用于大型有序数据集。 - **哈希查找**:通过哈希函数快速定位元素,时间复杂度可达到O(1)。 3. **图算法**: - **深度优先搜索(DFS)*...

    C常用算法程序集.rar

    - **二分查找**:在有序数组中查找元素,每次查找将搜索范围减半,时间复杂度为O(log n)。 - **哈希查找**:通过哈希函数快速定位元素,理想情况下可达到O(1)的查找速度,但可能会有哈希冲突。 3. **图算法**: ...

    C程序设计-c常用算法程序集

    - **二分查找**:适用于有序数组,每次查找都将查找范围减半,效率较高。 - **哈希查找**:通过哈希函数快速定位元素,但需要解决哈希冲突问题。 3. **递归与回溯**: - **斐波那契数列**:递归求解,但可能会有...

    C程序算法大全

    二分搜寻法是一种在有序数组中查找特定元素的高效算法,时间复杂度为O(log n)。 #### 40. 插补搜寻法 插补搜寻法是二分搜寻法的改进,通过预测目标元素的位置来加速搜索。 #### 41. 费氏搜寻法 费氏搜寻法是一种...

    算法分析中的若干个源码

    砝码问题通常涉及到二分查找或者动态规划,常用于解决平衡问题或者找寻最优化解。在实际应用中,例如在电子秤的精度校准或物品重量估计中,我们可以使用砝码进行精准衡量。源码可能展示了如何通过递归或迭代的方式...

    C语言实现一些经典算法,可以免费下载

    34. 循序搜寻法、二分搜寻法、插补搜寻法、费氏搜寻法 这些是搜索算法。循序搜寻法是最基本的线性搜索。二分搜寻法适用于有序序列,每次都将搜索区间减半。插补搜寻法适用于已排序的线性表,并且假设表中数据分布是...

    lintcode阶梯训练美国大公司所有题目代码和笔记合集

    这道题目要求在有序数组中查找目标元素的第一个出现位置,是二分查找的经典应用。解题的关键在于理解二分查找的原理,并灵活处理边界条件。通过对数组进行分割,不断缩小查找范围,最终定位到目标元素。 二、《背包...

    算法:我学习算法

    - 二分查找:适用于有序列表,每次查找都缩小一半的搜索范围,效率较高。 3. 图形算法: - 深度优先搜索(DFS):从起点开始,沿着一条路径深入探索,直到无法再走为止,然后回溯到一个未被访问的节点继续探索。 ...

    算法大全(C语言版本)很经典

    - **定义**: 二分搜寻是一种高效的搜索算法,尤其适用于已排序数组。 - **应用场景**: 数据搜索。 ### 43. 插补搜寻法 #### 说明 - **定义**: 插补搜寻法是一种适用于有序数组的搜索算法,它利用了线性插值的原理...

Global site tag (gtag.js) - Google Analytics