45-二分查找实现

摘自:https://blog.csdn.net/maoyuanming0806/article/details/78176957

二分查找是一种查询效率非常高的查找算法。又称折半查找

起初在数据结构中学习递归时实现二分查找,实际上不用递归也可以实现,毕竟递归是需要开辟额外的空间的来辅助查询。本文就介绍两种方法

二分查找算法思想

有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功。


一个情景:将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

二分查找图示说明

二分查找优缺点


优点是比较次数少,查找速度快,平均性能好;

其缺点是要求待查表为有序表,且插入删除困难。

因此,折半查找方法适用于不经常变动而查找频繁的有序列表。


使用条件:查找序列是顺序结构,有序。

一下为两种实现方法:

import java.util.Scanner;

public class Main{
//	public static int [] a = new int[20];
	
	public static void main(String[] args){
		
		Scanner cin = new Scanner(System.in);
		int a[] = {1,3,5,7,9,11,22};
		
		int len = 5;
		
		int w = erfen(a, 0, 5, 6);
		int w2 = erfen2(a, 0, 5, 6);
		
		System.out.println(w);
		System.out.println(w2);
		
	}
	
	// 二分查找:递归版
	public static int erfen(int[] a, int left, int right, int key) {
		int mid = left + (right - left) / 2; // 这样可以避免 (left + right)益出现象
		if(key < a[left] || key > a[right] || left > right){
			return -1;				
		}
//		System.out.println(a[mid]);
		if(a[mid] == key) {
			return mid;
		}
		else if(a[mid] > key){
			return erfen(a, left, mid - 1, key);
		}
		else {
			return erfen(a, mid + 1, right, key);
		}
	}
	
	// 用循环做二分查找
	public static int erfen2(int[] a, int left, int right, int key) {
		int mid;
		
		while(left <= right) {
			mid = left + (right - left) / 2;
			if(key == a[mid]) {
				return mid;
			}
			else if(key < a[mid]) {
				right = mid - 1;
			}
			else {
				left = mid + 1;
			}
		}
		
		return -1;
	}
	
}

/*
 

*/

  

猜你喜欢

转载自www.cnblogs.com/zhumengdexiaobai/p/10503838.html