线性查找
package com.weeks.search;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class SequenceSearch {
public static void main(String[] args) {
int[] arr = {33, 4, 5, 66, 79, 38, 18, 46, 5};
List<Integer> list = sequenceSearch(arr, 5);
if(list == null){
System.out.println("数组中不存在要查找的元素!");
}else{
System.out.println(list);
}
}
public static List<Integer> sequenceSearch(int[] arr, int value){
List<Integer> list = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {
if(arr[i] == value){
list.add(i);
}
}
return list;
}
}
二分查找
package com.weeks.search;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {1, 3, 5, 5, 5, 5, 6, 8, 25};
List<Integer> list = binarySearchMore(arr, 0, arr.length - 1, 5);
System.out.println(list);
}
public static int binarySearch(int[] arr, int left, int right, int value){
if(left > right){
return -1;
}
int mid = (left + right) / 2;
if(value < arr[mid]){
return binarySearch(arr, left, mid - 1, value);
}else if(value > arr[mid]){
return binarySearch(arr, mid + 1, right, value);
}else {
return mid;
}
}
public static List<Integer> binarySearchMore(int[] arr, int left, int right, int value){
if(left > right){
return new ArrayList<Integer>();
}
int mid = (left + right) / 2;
List<Integer> list = new ArrayList<>();
if(value < arr[mid]){
return binarySearchMore(arr, left, mid - 1, value);
}if(value > arr[mid]){
return binarySearchMore(arr, mid + 1, right, value);
}else{
list.add(mid);
int lIndex = mid;
int rIndex = mid;
while(arr[--lIndex] == value && lIndex >= left){
list.add(lIndex);
}
while(arr[++rIndex] == value && rIndex <= right){
list.add(rIndex);
}
return list;
}
}
}
插值查找
package com.weeks.search;
public class InsertValueSearch {
public static void main(String[] args) {
int[] arr = new int[100];
for (int i = 0; i < 100; i++) {
arr[i] = i + 1;
}
int index = insertValueSearch(arr, 0, arr.length - 1, 75);
System.out.println(index);
}
public static int insertValueSearch(int[] arr, int left, int right, int value){
if(left > right || value > arr[arr.length - 1] || value < arr[0]){
return -1;
}
int mid = left + (right - left) * (value - arr[left]) / (arr[right] - arr[left]);
int midVal = arr[mid];
if(value > midVal) {
return insertValueSearch(arr, mid + 1, right, value);
}else if (value < midVal){
return insertValueSearch(arr, left, mid - 1, value);
} else{
return mid;
}
}
}
斐波那契查找
package com.weeks.search;
import java.util.Arrays;
public class FibonacciSearch {
public static void main(String[] args) {
int[] arr = {1,8, 10, 89, 1000, 1234};
int i = fibonacciSearch(arr, 1234);
System.out.println(i);
}
public static int[] fibonacciArray(){
int[] f = new int[20];
f[0] = 1;
f[1] = 1;
for (int i = 2; i < f.length; i++) {
f[i] = f[i - 1] + f[i - 2];
}
return f;
}
public static int fibonacciSearch(int[] arr, int value){
int low = 0;
int high = arr.length - 1;
int[] f = fibonacciArray();
int k = 0;
while(high > f[k] - 1){
k++;
}
int[] temp = null;
if(arr.length < f[k]){
temp = Arrays.copyOf(arr, f[k]);
}
for (int i = high + 1; i < temp.length; i++) {
temp[i] = arr[high];
}
int mid = 0;
while(low < high){
mid = low + f[k] - 1;
if(value < temp[mid]){
high = mid - 1;
k--;
}else if(value > temp[mid]){
low = mid + 1;
k -= 2;
}else {
if(mid > high){
return high;
}else{
return mid;
}
}
}
return -1;
}
}