顺序查找与二分查找解析

顺序查找

非常简单

示例1:在成绩中查询分数是100的第一个分数 99 86 59 63 49 100 99 78

for(int i =0 ;i<a.lenth;i++){
			if(a[i])==100){
				return i;
			}
		}

示例2:在学生中查询分数是100的第一个学生

存储结构可以是顺序表,也可以是链表。

逐个比较查询,如果找到,返回数据或者索引,如果到最后也没有找到,返回null

可以是在顺序表中,也可以是在链表中

在各个节点查找概率相同情况下,默认查询长度为一半长度,所以时间复杂度是T(n) = O(n);

package com.bjsxt.ds.search;
/**
 * 在成绩中查询分数是100的第一个分数
 * 
 * T(n) = O(n)
 * S(n) = O(1)

 * @author Administrator
 *
 */
public class TestSearch {
	public static void main(String[] args) {
		//定义一组分数
		int [] scoreArr = {89,45,78,45,100,98,86,100,65};
		int score = 100;
		//进行查收
		int index = search(scoreArr,score);
		//输出结果
		if(index == -1){
			System.out.println("没有找到");
		}else{
			 System.out.println("找到,索引是:"+index);
		}
	}
	
	public static int search(int []  scoreArr,int score){
		int index = -1;//默认没有找到
		for(int i= 0;i<scoreArr.length;i++){
			if(scoreArr[i] == score){
				index = i;
				break;
			}
		}
		return index;
	}
}

二分查找

这种查找方法需要待查的查找表满足两个条件:
首先,查找表必须使用顺序存储结构;
其次,查找表必须按关键字大小有序排列。

使用非递归实现折半查找

key=21的查找过程
在这里插入图片描述
key=85的查找过程

public class BinarySearch {
	public static void main(String[] args) {
		int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
		System.out.println(searchLoop(array, 101));
	}

	/**
	 * 循环二分查找,返回第一次出现该值的位置
	 * 
	 * @param array
	 *            已排序的数组
	 * @param findValue
	 *            需要找的值
	 * @return 值在数组中的位置,从0开始。找不到返回-1
	 */
	public static int searchLoop(int[] array, int findValue) {
		// 如果数组为空,直接返回-1,即查找失败
		if (array == null) {
			return -1;
		}
		// 起始位置
		int start = 0;
		// 结束位置
		int end = array.length - 1;
		while (start <= end) {
			// 中间位置
			int middle = (start + end) / 2;
			// 中值
			int middleValue = array[middle];
			if (findValue == middleValue) {
				// 等于中值直接返回
				return middle;
			} else if (findValue < middleValue) {
				// 小于中值时在中值前面找
				end = middle - 1;
			} else {
				// 大于中值在中值后面找
				start = middle + 1;
			}
		}
		// 返回-1,即查找失败
		return -1;
	}
}

使用递归实现折半查找
在这里插入图片描述
折半查找的时间复杂度
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/s_pr1te/article/details/89641612
今日推荐