线性查找和二分查找算法

线性查找算法

public class SeqSearch{
	public static void main(String[] args){
		int[] arr = {1, 9, 11, -1, 34, 89};
		int index = seqSearch(arr, 11);
		if(index == -1){
			System.out.println("没有找到");
		}else{
			System.out.println("找到了,下标 = " + index);
		}
	}
	
	public static int SeqSearch(int[] arr, int findVal){
		for(int i = 0; i < arr.length; i++){
			if(arr[i] == findVal){
				return i;
			}
		}
		return -1;
	}
}

二分查找
注意使用二分查找的前提是该数组是有序的!
这里的二分查找,主要是利用了递归法

下面我们先提出一种写法,这种写法的缺点再于只能返回第一个找到的目标值的下标

public class BinarySearch{
	public static void main(String[] args){
		int[] arr = {1, 2, 4, 6, 12, 45, 56};
		int resIndex = binarySearch(arr, 0, arr.length - 1, 4);
		System.out.println("resIndex = " + resIndex);
	}
	
	public static int binarySearch(int[] arr, int left, int right, int findVal){
		if(left > right){
			return -1;
		}
		int mid = (left + right) / 2;
		int midVal = arr[mid];
		
		if(findVal < mid){
			binarySearch(arr, left, mid - 1, findVal);
		}else if(findVal > mid){
			binarySearch(arr, mid + 1, right, findVal);
		}else{
			return mid;
		}
	}
}

下面我们优化一下用数组返回所有找到的结果

public class BinarySearch{
	public static void main(String[] args){
		int[] arr = {1, 2, 4, 6, 12, 45, 56};
		List<Integer>resIndexList = binarySearch(arr, 0, arr.length - 1, 4);
		System.out.println("resIndexList = " + resIndexList);
	}
	
	public static int binarySearch(int[] arr, int left, int right, int findVal){
		if(left > right){
			return new ArrayList<Integer>();
		}
		int mid = (left + right) / 2;
		int midVal = arr[mid];
		
		if(findVal < mid){
			binarySearch(arr, left, mid - 1, findVal);
		}else if(findVal > mid){
			binarySearch(arr, mid + 1, right, findVal);
		}else{
			//思路分析:
			//1.在找到mid值的时候,不要马上返回
			//2.向mid索引值左边扫描,将所有满足findVal的元素的下标,加入到集合ArrayList
			//3.向mid索引值右边扫描,将所有满足findVal的元素的下标,也加入ArrayList
			//4.将ArrayList返回
			ArrayList<Integer>resIndexList = new ArrayList<Integer>();
			int temp = mid - 1;
			while(true){
				if(temp < 0 || arr[temp] != findVal){
					break;
				}else{
					resIndexList.add(temp);
					temp -= 1;//temp左移			
				}
			}
			//把第一次时找到的那个值放进去
			//注意这个要放在左查找后面再放进去,保证顺序
			resIndexlist.add(mid);
			temp = mid + 1;
			while(true){
				if(temp > arr.length - 1 || arr[temp] != findVal){
					break;
				}
				else{
					resIndexlist.add(temp);
					temp += 1;//temp左移
				}
			}
		}
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值