- 顺序查找使用岗哨可以节约一半的时间. 为此, 第 0 个位置不可以放有意义的数据, 即有效数据只有 length - 1 个。
- 顺序查找时间复杂度为 O ( n ) O(n)O(n)。
- 折半查找时间复杂度为 O ( log n ) O(\log n)O(logn)。
- 书上为简化起见, 只关注键. 这里使用键值对来表示一条完整的数据. 实际应用中可以把 content 改成任何想要的数据类型
package java41to50;
public class D41_DataArray {
class DataNode {
int key;
String content;
DataNode(int paraKey, String paraContent) {
key = paraKey;
content = paraContent;
}
public String toString() {
return "(" + key + ", " + content + ") ";
}
}
DataNode[] data;
int length;
public static void main(String[] args) {
System.out.println("\r\n-------顺序搜索测试-------");
sequentialSearchTest();
System.out.println("\r\n-------二进制搜索测试-------");
binarySearchTest();
}
public D41_DataArray(int[] keyArray, String[] contentArray) {
length = keyArray.length;
data = new DataNode[length];
for (int i = 0; i < length; i++) {
data[i] = new DataNode(keyArray[i], contentArray[i]);
}
}
public String toString() {
String resultString = "数据数组的项目个数:" + length + " .\r\n";
for (int i = 0; i < length; i++) {
resultString += data[i] + " ";
}
return resultString;
}
public String sequentialSearch(int key) {
data[0].key = key;
int i;
for (i = length - 1; data[i].key != key; i--) {
;
}
return data[i].content;
}
public static void sequentialSearchTest() {
int[] unsortedKeys = { -1, 5, 3, 6, 10, 7, 1, 9 };
String[] contents = { "null", "if", "then", "else", "switch", "case", "for", "while" };
D41_DataArray dataArray = new D41_DataArray(unsortedKeys, contents);
System.out.println(dataArray);
System.out.println("Search result of 10 is: " + dataArray.sequentialSearch(10));
System.out.println("Search result of 5 is: " + dataArray.sequentialSearch(5));
System.out.println("Search result of 4 is: " + dataArray.sequentialSearch(4));
}
public String binarySearch(int key) {
int left = 0;
int right = length - 1;
int middle = (left + right) / 2;
while (left <= right) {
middle = (left + right) / 2;
if (data[middle].key == key) {
return data[middle].content;
} else if (data[middle].key <= key) {
left = middle + 1;
} else {
right = middle - 1;
}
}
return "null";
}
public static void binarySearchTest() {
int[] sortedKeys = { 1, 3, 5, 6, 7, 9, 10 };
String[] contents = { "if", "then", "else", "switch", "case", "for", "while" };
D41_DataArray dataArray = new D41_DataArray(sortedKeys, contents);
System.out.println(dataArray);
System.out.println("Search result of 10 is: " + dataArray.binarySearch(10));
System.out.println("Search result of 5 is: " + dataArray.binarySearch(5));
System.out.println("Search result of 4 is: " + dataArray.binarySearch(4));
}
}
输出结果:
-------顺序搜索测试-------
数据数组的项目个数:8 .
(-1, null) (5, if) (3, then) (6, else) (10, switch) (7, case) (1, for) (9, while)
Search result of 10 is: switch
Search result of 5 is: if
Search result of 4 is: null
-------二进制搜索测试-------
数据数组的项目个数:7 .
(1, if) (3, then) (5, else) (6, switch) (7, case) (9, for) (10, while)
Search result of 10 is: while
Search result of 5 is: else
Search result of 4 is: null