顺序查找
代码实现:
public class SeqSearch {
public static void main(String[] args) {
int[] arr ={1,9,11,-1,34,89};
int index = seqSearch(arr, 11);
if (index == -1){
System.out.println("没有找到");
}else {
System.out.println("找到下标为"+index);
}
}
/**
* 线性查找
* @param arr
* @param value
* @return
*/
public static int seqSearch(int[] arr, int value){
//线性查找是逐一比对,发现有相同值就返回下标
for (int i = 0; i <arr.length ; i++) {
if (arr[i]==value){
return i;
}
}
return -1;
}
}
二分查找
思路分析:
前提是这个数组必须是有序的,设置一个数组中间值,如果大于这个值,那么向右递归,如果小于这个值那么向左递归
代码实现:
package search;
//使用二分查找的前提是这个数组是有序的
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {1, 8, 10, 89, 1000, 1234};
int finalIndex = binarySearch(arr, 0, arr.length - 1, 4324234);
System.out.println(finalIndex);
}
//二分查找算法
//只使用于有序
/**
* @param arr 数组
* @param left 左边
* @param right 右边
* @param findVal 要查找的值
* @return 如果没有找到就返回下标,如果没有找到,就返回-1
*/
public static int binarySearch(int[] arr, int left, int right, int findVal) {
if (left > right) {
return -1;
}
int mid = (left + right) / 2;
int midVal = arr[mid];
if (findVal > midVal) {
//如果findVal比较大,那么就向右递归
binarySearch(arr, mid + 1, right, findVal);
} else if (findVal < midVal) {
binarySearch(arr, left, mid - 1, findVal);
} else {
return mid;
}
return -1;
}
}
优化:实现返回多条数据
思路分析:
在返回mid的时候需要向左和向右进行查找,如果找到了相同值就返回到集合里面
代码实现:
package search;
import java.util.ArrayList;
import java.util.List;
//使用二分查找的前提是这个数组是有序的
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {1, 8, 10, 89, 1000, 1000, 1000, 1234};
List<Integer> list = binarySearch(arr, 0, arr.length - 1, 1000);
System.out.println(list);
}
//二分查找算法
//只使用于有序
/**
* @param arr 数组
* @param left 左边
* @param right 右边
* @param findVal 要查找的值
*/
public static List<Integer> binarySearch(int[] arr, int left, int right, int findVal) {
if (left > right) {
return new ArrayList<Integer>();
} else {
int mid = (left + right) / 2;
int midVal = arr[mid];
if (findVal > midVal) {
//如果findVal比较大,那么就向右递归
return binarySearch(arr, mid + 1, right, findVal);
} else if (findVal < midVal) {
return binarySearch(arr, left, mid - 1, findVal);
} else {
ArrayList<Integer> integers = new ArrayList<>();
//先设置左边的
int temp = mid - 1;
while (true) {
//判断左边这个数是不是等于findVal
if (temp < 0 || arr[temp] != findVal) {
break;
}
integers.add(temp);
temp--;
}
//加入Mid中间值
integers.add(mid);
//扫描右边的
temp = mid + 1;
while (true) {
//判断左边这个数是不是等于findVal
if (temp > arr.length - 1 || arr[temp] != findVal) {
break;
}
integers.add(temp);
temp++;
}
return integers;
}
}
}
}
插值查找
思路分析:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sjZSYRkc-1633868016956)(C:%5CUsers%5C%E4%B8%BF%E5%89%91%E6%9D%A5%C2%B7%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20211007085432829.png)]
思路和二分查找相似,但是查找的mid值发生了替换
代码实现:
package search;
import sun.font.CreatedFontTracker;
//判断是否越界以及进行递归做的
//同时我们也假定他是有序的
public class InsertSearch {
public static void main(String[] args) {
int[] arr =new int[100];
for (int i = 0; i <100 ; i++) {
arr[i] = i+1;
}
int i = insertSearch(arr, 0, arr.length - 1, 1);
System.out.println(i);
}
public static int insertSearch(int[] arr, int left, int right, int findVal) {
System.out.println("hello~~~~~~");
//先设置越界标准
if (left > right || findVal < arr[0] || findVal > arr[arr.length - 1]) {
return -1; //提前退出递归
}
int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);
int midVal = arr[mid];
if (findVal > midVal) {
//如果大就右递归
return insertSearch(arr, mid + 1, right, findVal);
} else if (findVal < midVal) {
return insertSearch(arr, left, mid - 1, findVal);
}else {
return mid;
}
}
}