import java.util.Arrays;
//顺序查找法
public class Main {
public static void main(String[] args) {
//查找表
int[] arr = {4, 3, 5, 1, 2};
System.out.print("5在数组中的索引:");
System.out.println(SearchSeq(arr, 5));
Arrays.sort(arr);
System.out.print("2在数组中的索引:");
System.out.println(BinarySearch(arr, 2));
System.out.print("6在数组中的索引:");
System.out.println(BinarySearch(arr, 6));
arr = new int[]{24, 21, 6, 11, 8, 22, 32, 31, 54, 72, 61, 78, 88, 83};
System.out.print("88在数组中的索引:");
System.out.println(PartitionSearch(arr, 88));
}
//顺序查找
public static int SearchSeq(int[] arr, int key) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == key)
return i;
}
return -1;
}
//折半查找,有序序列
public static int BinarySearch(int[] arr, int key) {
int low = 0, high = arr.length - 1, mid;
while (low <= high) {
mid = (low + high) / 2;
if (arr[mid] == key) {
return mid;
} else if (arr[mid] < key) {
low = mid + 1;
} else high = mid - 1;
}
return -1;
}
//分块查找,块内无序,块间有序
//过程模拟
public static int PartitionSearch(int[] arr, int key) {
//对arr手动分块,已知arr的情况
IndexTable indexTable1=new IndexTable();
IndexTable indexTable2=new IndexTable();
IndexTable indexTable3=new IndexTable();
IndexTable indexTable4=new IndexTable();
IndexTable []tables={indexTable1,indexTable2,indexTable3,indexTable4};
tables[0].setIndex(0);
tables[0].setMaxData(24);
tables[1].setIndex(6);
tables[1].setMaxData(54);
tables[2].setIndex(9);
tables[2].setMaxData(78);
tables[3].setIndex(12);
tables[3].setMaxData(88);
tables[0].setCount(6);
tables[1].setCount(3);
tables[2].setCount(3);
tables[3].setCount(2);
for (int i = 0; i < tables.length; i++) {
if (key == tables[i].getMaxData()|| key<tables[i].getMaxData()&&i==0) {
for (int j = tables[i].getIndex(); j < tables[i].getIndex() + tables[i].getCount(); j++) {
if (arr[j] == key)
return j;
}
}
}
for (int i = 0; i < tables.length - 1; i++) {
if (key > tables[i].getMaxData() && key < tables[i + 1].getMaxData()) {
for (int j = tables[i + 1].getIndex(); j < tables[i + 1].getIndex() + tables[i + 1].getCount(); j++) {
if (arr[j] == key)
return j;
}
return -1;
}
}
return -1;
}
}
创建一个索引表对象,用来分块
public class IndexTable {
private int maxData;
private int index;
private int count;
public IndexTable() {
}
public int getMaxData() {
return maxData;
}
public void setMaxData(int maxData) {
this.maxData = maxData;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}