JAVA七大查找算法

参考链接:https://www.cnblogs.com/maybe2030/p/4715035.html#_label3

查找:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)

查找算法的分类:

  1. 静态查找与动态查找:静态查找与动态查找都是针对查找表而言的额,动态表指查找表中有删除与插入操作的表
  2. 无需查找与有序查找:根据被查找的数列是否有序

平均查找长度(ASL): 需和指定key进行比较的关键字的个数的期望值,成为查找算法在查找成功时的平均查找长度。
eg:对于含有N个元素的查找表,场照成功时的平均查找长度为:ASL=Pi*Ci的和
Pi:查找表中第i个数据元素的概率
Ci:查找到第i个元素时,已经比较大的次数

静态查找

1、顺序查找

时间复杂度为O(n);空间复杂度为O(1);ASL为 (n+1)/2 ;

原理 :又称为线性查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。

说明:顺序查找适合于存储结构为顺序存储或链接存储的线性表。

代码实现

public static int sequence_search(int[] arr,int key) {
   //依次遍历,key为待查关键字
		for(int i=0;i<arr.length;i++) {
   
			if(key==arr[i]) {
   
				return i;
			}
		}
		return -1;
	}
}

2、二分查找

时间复杂度为O(log2n);空间复杂度为O(1);ASL为log2(n+1)

原理: 也成为折半查找,属于有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。

折半查找的前提条件是需要 有序表顺序存储,对于 静态查找表,一次排序后不再变化,折半查找 能得到不错的效率 。但对于需要频繁执行插入或删除操作的 动态数据集 来说,维护有序的排序会带来不小的工作量,那就 不建议使用

代码实现:

	public static int N_binary_search(int[] arr,int start,int end,int key) {
   
		int mid=(start+end)/2; //每次折半比较
		if(start<=end) {
   
			if(key>arr[mid]) {
   
				return N_binary_search(arr,mid+1,end,key);
			}else if(key<arr[mid]) {
   
				return N_binary_search(arr,start,mid-1,key);
			}else {
   
				return mid;
			}
		}else {
   
			return -1;
		}
	}
	//非递归
	public static int binary_search(int [] arr,int start,int end,int key) {
   
		while(start<=end) {
   
			int mid=(start+end)/2;
			if(key>arr[mid]) {
   
				start=mid+1;
			}else if(key<arr[mid]) {
   
				end=mid-1;
			}else {
   
				return mid
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值