顺序查找
非常简单
示例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;
}
}
使用递归实现折半查找
折半查找的时间复杂度