搜索算法-顺序查找和二分查找

本文介绍了两种基本的查找算法——顺序查找与二分查找。顺序查找通过遍历数组找到目标值的位置,而二分查找则利用数组有序的特点快速定位。文章提供了这两种查找算法的具体实现代码,并对比了它们在不同情况下的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习《轻松学算法》

一顺序查找

    给定一个数列和一个数key,找出第一个与key相同的数的下标。

   原理:从数列开始一个一个进行比较,这个还是比较简单的。

package xxc.algorithm.ch04.SequentialSearch;

public class SequentialSearch {
		
	private int[] array;
	public SequentialSearch(int[] array) {
		this.array=array;
	}
	
	/**
	 * 直接顺序查找
	 * @param key
	 * @return
	 */
	 
	public int search(int key) {
		for(int i=0;i<array.length;i++) {
			if (key == array[i]) {
				return i;
			}
		}
		return -1;
	}
	
	
        /**
	 * 优化查找 将key的值放到数组下标为0的元素上,从后往前查找,直到k与某数相同
	 * @param key
	 * @return
	 */
public int search2(int key) {if(key==array[0]) {return 0;}int temp = array[0];array[0]=key;int i = array.length-1;while (array[i]!=key) {i--;}array[0]=temp;if (i==0) {return -1;}return i;}}



细细比较这两个顺序查找就会发现,两者还是会有差异的。当数列存在相同元素时,前者输出从前往后的相同元素下标,后者输出从后往前的相同元素下标。尽管两者找出的数与key相同,但是找出的数在数列中的位置是不同的。


二 二分查找

   条件

   1 需要数列有序 

   2 需要数列使用顺序存储结构

   过程:

   假设数列从小到大排列,比较一个元素key与数列中间位置的大小,假如key大,那么在中间位置至末尾的数列的子数列中进行二分查找;如果key小,在开头至中间位置的数列的子数列中进行二分查找。每次查找的数列都是前一次数列的一半。

package xxc.algorithm.ch04.BinarySearch;


public class BinarySearch {
	private int[] array;
	
    public BinarySearch(int[] array) {
		this.array = array;
	}
    
    public int searchRecursion(int target) {
    		if (array != null) {
				return searchRecursion(target, 0, array.length);
			}
		return -1;
	}
    
    public int searchRecursion(int target, int start, int end) {
		if (start>end) {
			return -1;
		}
		int mid = (start+end)/2;
		if (array[mid] == target) {
			return mid;
		}else if (target<array[mid]) {
			return searchRecursion(target, 0, mid-1);   //递归查找
		}else {
			return searchRecursion(target, mid+1, end);
		}		
	}
    
    public int search(int target) {
    		if(array == null) {
    			return -1;
    		}
    		int start = 0;
    		int end = array.length-1;
    		while(start<=end) {
    			int mid = start+(end-start)/2;
    			if (array[mid]==target) {
				return mid;
			}else if (target<array[mid]) {
				end = mid-1;
			}else {
				start = mid+1;
			}
    		}
		return -1;
	}
    
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值