查找(Search)又称检索,同排序一样,也有内查找和外查找之分。若整个查找过程都在内存中进行,则成为 内查找;反之,称为 外查找。其中,顺序表的查找最常用的主要有两种方法:顺序查找和二分查找。
0. 时间复杂度
- 顺序查找:O(n)
- 二分查找:O(log n)
- 分块查找: O(√n)
1. 顺序查找
Java
package com.study;
import java.util.ArrayList;
import java.util.List;
/**
* 用途:数据结构-- 学习--顺序查找
* 开发:zhangmj
* 日期:2020/3/15 17:14
*/
public class DataSearchStudy {
public static void main(String[] args) {
List<String> seqList = new ArrayList<>();
seqList.add("a");
seqList.add("b");
seqList.add("c");
seqList.add("d");
String k = "s";
int index = seqSearch(seqList, k);
System.out.println(k + "的下标是 " + index);
}
/**
* 若找到 k 的值返回其下标,找不到返回 -1
* @param seqList
* @param k 查找值
* @return
*/
public static int seqSearch(List<String> seqList, String k){
for (int i = 0; i < seqList.size(); i++) {
if(k.equals(seqList.get(i))){
return i;
}
}
return -1;
}
}
2. 二分查找
Java
package com.study;
import java.util.Arrays;
/**
* 用途:数据结构-- 学习--二分查找
* 开发:zhangmj
* 日期:2020/3/15 17:55
*/
public class binSearchStudy {
public static void main(String[] args) {
int[] array = {1,3,4,5,11,23,12,35,32};
int key = 2;
Arrays.sort(array);
// 使用二分查找,元素一定要是有序的
int index = binSearch(array, key);
System.out.println("[循环二分查找] " + key + " 的下标为: " + index);
index = binSearch(array, key, 0, array.length-1);
System.out.println("[递归二分查找] " + key + " 的下标为: " + index);
}
/**
* 循环实现二分查找
*/
public static int binSearch(int[] array, int key){
int low = 0;
int high = array.length - 1;
while (low <= high){
int mid = (low + high) >>> 1;
int v = array[mid];
if(v > key){
high = mid - 1;
}else if(v < key){
low = mid + 1;
}else {
return mid;
}
}
return -1;
}
/**
* 递归实现二分查找
*/
public static int binSearch(int[] array, int key, int low, int high){
if(low <= high){
int mid = (low + high) >>> 1;
if(key < array[mid]){
return binSearch(array, key, low, mid - 1);
}else if(key > array[mid]){
return binSearch(array, key, mid + 1, high);
}else {
return mid;
}
}
return -1;
}
}