学习数据结构和算法的日常Demo
查找算法介绍
在java中,我们常用的查找有四种:
- 顺序(线性查找)
- 二分查找
- 插值查找
- 斐波拉契查找
线性查找算法
代码实现:
public class 线性查找 {
public static void main(String args[]) {
int a[] = {6, 2, 32, 43, 8, 16, 21, 9, 77, -2};
int i = seqSearch(a, -2);
if (i == -1) {
System.out.println("没有找到!");
} else {
System.out.println("下标:" + i);
}
}
// 找到一个满足条件的值就返回
private static int seqSearch(int[] a, int value) {
// 线性查找是逐一比对
for (int i = 0; i < a.length; i++) {
if (a[i] == value) {
return i;
}
}
return -1;
}
}
二分查找算法
思路分析:
代码实现:
public class 二分查找 {
public static void main(String args[]) {
// 二分查找需要数组排序
int a[] = {-2, 2, 6, 8, 9, 16, 16, 16, 16, 21, 32, 43, 77};
// int i = binarySearch(a, 0, a.length - 1, 16);
// if (i == -1) {
// System.out.println("没有找到!");
// } else {
// System.out.println("下标:" + i);
// }
ArrayList<Integer> list = binarySearchAll(a, 0, a.length - 1, 16);
System.out.println("下标集合:" + list);
}
// 找到一个满足条件的值就返回
private static int binarySearch(int[] a, int left, int right, int value) {
if (left > right) {
return -1;
}
int mid = (left + right) / 2;
// value在mid右边
if (a[mid] < value) {
return binarySearch(a, mid + 1, right, value);
} else if (a[mid] > value) {
// value在mid左边
return binarySearch(a, left, mid - 1, value);
} else {
return mid;
}
}
// 找出数组中所有的和value一样的值的下标
// 找到mid时不返回,继续向mid索引值的左边扫描,将所有满足的加入集合
// 向mid索引值的右边扫描,将所有满足的加入集合
private static ArrayList<Integer> binarySearchAll(int[] a, int left, int right, int value) {
if (left > right) {
return new ArrayList<>();
}
int mid = (left + right) / 2;
// value在mid右边
if (a[mid] < value) {
return binarySearchAll(a, mid + 1, right, value);
} else if (a[mid] > value) {
// value在mid左边
return binarySearchAll(a, left, mid - 1, value);
} else {
ArrayList<Integer> indexList = new ArrayList<>();
// 向左边搜索
int temp = mid - 1;
while (true) {
if (temp < 0 || a[temp] != value) {
break;
}
indexList.add(temp);
temp -= 1;
}
indexList.add(mid);
// 向右边搜索
temp = mid + 1;
while (true) {
if (temp > a.length - 1 || a[temp] != value) {
break;
}
indexList.add(temp);
temp += 1;
}
return indexList;
}
}
}
插值查找算法
原理介绍
代码实现
public class 插值查找 {
public static void main(String args[]) {
int a[] = new int[100];
// 要求数组排序且有序
for (int i = 0; i < 100; i++) {
a[i] = i + 1;
}
int i = insertValueSearch(a, 0, a.length - 1, 100);
if (i == -1) {
System.out.println("没有找到!");
} else {
System.out.println("下标:" + i);
}
}
// 找到一个满足条件的值就返回
private static int insertValueSearch(int[] a, int left, int right, int value) {
// 防止越界
if (left > right || value < a[0] || value > a[a.length - 1]) {
return -1;
}
// 自适应
int mid = left + (right - left) * (value - a[left]) / (a[right] - a[left]);
if (a[mid] < value) {
// value在mid右边
return insertValueSearch(a, mid + 1, right, value);
} else if (a[mid] > value) {
// value在mid左边
return insertValueSearch(a, left, mid - 1, value);
} else {
return mid;
}
}
}