Searching Algorithms: Sequential Search
. 前言
该博客用于本弱鸡复习巩固,打牢基础,还望各大佬不吝赐教。
. 基本思路
顺序查找是最简单最基本的查找方式
给定关键字 key 从数组中第一个元素开始,一直遍历到最后一个,直到找到该元素。
改进顺序查找 与 顺序查找
改进顺序查找将数组成最后一位设置为标志位,
这样解决了每次将 角标 i 与 数组长度 n 作比较的麻烦,降低了算法复杂度。
. 图片示例
. 算法复杂度分析
平均 | 最好 | 最坏 |
---|---|---|
O(n) | O(1) | O(1) |
平均查找次数为 (n+1)/2 | 第一次比较就找到 | 比较 n 次才找到,找不到则为 n+1 次 |
. 代码实现
1import java.util.ArrayList;
2import java.util.Collections;
3/**
4 * Sequential Search / Linear Search 顺序查找/线性查找
5 *
6 * 最简单最基本的查找方式
7 * 给定关键字 key 从数组中第一个元素开始,一直遍历到最后一个,直到找到该元素
8 *
9 * 改进顺序查找与顺序查找
10 * 改进顺序查找将数组成最后一位设置为标志位,
11 * 这样解决了每次将 角标i 与 数组长度n 作比较的麻烦,降低了算法复杂度。
12 *
13 * 算法复杂度分析
14 * 时间复杂度(平均) O(n) 平均查找次数为 (n+1)/2
15 * 时间复杂度(最坏) O(n) 比较 n 次才找到,找不到则为 n+1 次
16 * 时间复杂度(最好) O(1) 第一次比较就找到
17 */
18public class SeqSearch {
19
20 public static void main(String[] args) {
21
22 //将 1-10 打乱排序
23 ArrayList<Integer> a = new ArrayList<Integer>();
24 for (int i = 1; i < 10; i++) {
25 a.add(i);
26 Collections.shuffle(a);
27 }
28 System.out.println("Unordered Array :");
29 System.out.println(a.toString());
30
31 //定义查找关键字
32 int key = 4;
33 //顺序查找
34 seqSearch(key, a);
35 //改进顺序查找
36 advSeqSearch(key, a);
37
38 }
39
40 public static void seqSearch(int key, ArrayList<Integer> a) {
41 //每次都要与10作比较
42 for (int i = 0; i < 10; i++) {
43 if (a.get(i) == key) {
44 System.out.println("Find key = " + key + " at index : " + i);
45 break;
46 }
47 }
48 }
49
50 public static void advSeqSearch(int key, ArrayList<Integer> a) {
51 //将最后一位赋为key
52 a.add(key);
53 System.out.println("Unordered Array :");
54 System.out.println(a.toString());
55 int i = 0;
56 //从第0位开始,直到最后一位进行比较
57 //若最后 i=10 , 则证明被查找数组中找不到该元素key
58 while (!a.get(i++).equals(a.get(a.size() - 1))) {
59 }
60
61 System.out.println("If index = 10 , key does not exist .");
62 System.out.println("Find key = " + key + " at index : " + (i - 1));
63 }
64}