22、查找算法:顺序查找+二分查找

1、顺序查找过于简单,此处就不再赘述。

2、二分查找(适用于有序数组)

  • 思路: 要找的元素为targe,数组为arr:
1、首先定义left和right(left:数组最左边的index,right:数组左右最右边的index)
2、定义mid = (left+right)/2,比较mid处的元素和targe的大小
    2.1、如果arr[mid]>targe,那么要找的元素在left--mid之间,递归的进行左遍历;
    2.2、如果arr[mid]<targe,那么要找的元素在mid--right之间,递归的进行右遍历;
    2.3、如果arr[mid]=targe,则此时找到了一个和targe值相同的元素了。可以返回;
  • 代码:
package Search;

import java.util.ArrayList;
import java.util.List;

public class BinarySearch {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int[] arr = {1,2,3,4,4,4,5,6,7,8};
		BinarySearch binarySearch = new BinarySearch();
		int a = binarySearch.binarySearch(40, arr, 0, arr.length-1);
	
	}
	
	public int binarySearch(int targe, int[] arr, int left, int right) {
		
		if(left > right) {
			return -1;			
		}
		
		int mid = (left + right)/2;
		
		if(targe > arr[mid]) {//mid--right
			return binarySearch(targe, arr, mid+1, right);
		}else if(targe < arr[mid]) {//left  ---  mid
			return binarySearch(targe, arr, left, mid - 1);
		}else {
			return mid;
		}
		
		
	}
	

	

}

思考:当数组中有相同的元素时,怎么用二分查找法将和目标元素相同的所有元素查找到

(只需要在targe == arr[mid]处,左右遍历数组即可)

代码:

public ArrayList<Integer> binarySearch2(int targe, int[] arr, int left, int right) {
			
			if(left > right) {
				return new ArrayList<Integer>();			
			}
			
			int mid = (left + right)/2;
			
			if(targe > arr[mid]) {//mid--right
				return binarySearch2(targe, arr, mid+1, right);
			}else if(targe < arr[mid]) {//left  ---  mid
				return binarySearch2(targe, arr, left, mid - 1);
			}else {
				ArrayList<Integer> aList = new ArrayList<Integer>();
				//改此处(左右遍历两边,将相同的元素放入list中)
				
				//先往左查找
				int temp = mid - 1;
				while(temp > 0 && arr[temp] == arr[mid]) {
					aList.add(temp);
					temp--;
				}
				aList.add(mid);
				temp = mid + 1;
				while(temp < arr.length && arr[temp] == arr[mid]) {
					aList.add(temp);
					temp++;
				}
				
				
				
				return aList;
			}
			
			
		}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值