mirror of
				https://github.com/krahets/hello-algo.git
				synced 2025-11-04 06:07:20 +08:00 
			
		
		
		
	Add the chapter of searching.
This commit is contained in:
		@ -35,9 +35,10 @@ For full documentation visit [mkdocs.org](https://www.mkdocs.org).
 | 
				
			|||||||
| 更新:二叉搜索树 | 2022-11-14 |
 | 
					| 更新:二叉搜索树 | 2022-11-14 |
 | 
				
			||||||
| 更新:首页介绍 | 2022-11-15 |
 | 
					| 更新:首页介绍 | 2022-11-15 |
 | 
				
			||||||
| 更新:关于本书</br>新增:如何使用本书</br>新增:一起参与创作 | 2022-11-16 |
 | 
					| 更新:关于本书</br>新增:如何使用本书</br>新增:一起参与创作 | 2022-11-16 |
 | 
				
			||||||
 | 
					| 新增:查找算法 | 2022-11-19 |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## License
 | 
					## License
 | 
				
			||||||
 | 
					
 | 
				
			||||||

 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The **texts, codes, images, photos, and videos** present on the website(book) is licensed under a [CC BY-NC-SA-4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/).
 | 
					The **texts, codes, images, photos, and videos** present on this work is licensed under [CC BY-NC-SA-4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/).
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										52
									
								
								codes/java/chapter_searching/binary_search.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								codes/java/chapter_searching/binary_search.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					package chapter_searching;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class binary_search {
 | 
				
			||||||
 | 
					    /* 二分查找(双闭区间) */
 | 
				
			||||||
 | 
					    static int binarySearch(int[] nums, int target) {
 | 
				
			||||||
 | 
					        // 初始化双闭区间 [0, n-1] ,即 i, j 分别指向数组首元素、尾元素
 | 
				
			||||||
 | 
					        int i = 0, j = nums.length - 1;
 | 
				
			||||||
 | 
					        // 循环,当搜索区间为空时跳出(当 i > j 时为空)
 | 
				
			||||||
 | 
					        while (i <= j) {
 | 
				
			||||||
 | 
					            int m = (i + j) / 2;       // 计算中点索引 m
 | 
				
			||||||
 | 
					            if (nums[m] < target)      // 此情况说明 target 在区间 [m+1, j] 中
 | 
				
			||||||
 | 
					                i = m + 1;
 | 
				
			||||||
 | 
					            else if (nums[m] > target) // 此情况说明 target 在区间 [i, m-1] 中
 | 
				
			||||||
 | 
					                j = m - 1;
 | 
				
			||||||
 | 
					            else                       // 找到目标元素,返回其索引
 | 
				
			||||||
 | 
					                return m;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // 未找到目标元素,返回 -1
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* 二分查找(左闭右开) */
 | 
				
			||||||
 | 
					    static int binarySearch1(int[] nums, int target) {
 | 
				
			||||||
 | 
					        // 初始化左闭右开 [0, n) ,即 i, j 分别指向数组首元素、尾元素+1
 | 
				
			||||||
 | 
					        int i = 0, j = nums.length;
 | 
				
			||||||
 | 
					        // 循环,当搜索区间为空时跳出(当 i = j 时为空)
 | 
				
			||||||
 | 
					        while (i < j) {
 | 
				
			||||||
 | 
					            int m = (i + j) / 2;       // 计算中点索引 m
 | 
				
			||||||
 | 
					            if (nums[m] < target)      // 此情况说明 target 在区间 [m+1, j) 中
 | 
				
			||||||
 | 
					                i = m + 1;
 | 
				
			||||||
 | 
					            else if (nums[m] > target) // 此情况说明 target 在区间 [i, m) 中
 | 
				
			||||||
 | 
					                j = m;
 | 
				
			||||||
 | 
					            else                       // 找到目标元素,返回其索引
 | 
				
			||||||
 | 
					                return m;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // 未找到目标元素,返回 -1
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					        int target = 6;
 | 
				
			||||||
 | 
					        int[] nums = { 1, 3, 6, 8, 12, 15, 23, 67, 70, 92 };
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        /* 二分查找(双闭区间) */
 | 
				
			||||||
 | 
					        int index = binarySearch(nums, target);
 | 
				
			||||||
 | 
					        System.out.println("目标元素 6 的索引 = " + index);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* 二分查找(左闭右开) */
 | 
				
			||||||
 | 
					        index = binarySearch1(nums, target);
 | 
				
			||||||
 | 
					        System.out.println("目标元素 6 的索引 = " + index);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										45
									
								
								codes/java/chapter_searching/hashing_search.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								codes/java/chapter_searching/hashing_search.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,45 @@
 | 
				
			|||||||
 | 
					package chapter_searching;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import include.*;
 | 
				
			||||||
 | 
					import java.util.*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class hashing_search {
 | 
				
			||||||
 | 
					    /* 哈希查找(数组) */
 | 
				
			||||||
 | 
					    static int hashingSearch(Map<Integer, Integer> map, int target) {
 | 
				
			||||||
 | 
					        // 哈希表的 key: 目标元素,value: 索引
 | 
				
			||||||
 | 
					        // 若哈希表中无此 key ,返回 -1
 | 
				
			||||||
 | 
					        return map.getOrDefault(target, -1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* 哈希查找(链表) */
 | 
				
			||||||
 | 
					    static ListNode hashingSearch1(Map<Integer, ListNode> map, int target) {
 | 
				
			||||||
 | 
					        // 哈希表的 key: 目标结点值,value: 结点对象
 | 
				
			||||||
 | 
					        // 若哈希表中无此 key ,返回 -1
 | 
				
			||||||
 | 
					        return map.getOrDefault(target, null);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					        int target = 3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* 哈希查找(数组) */
 | 
				
			||||||
 | 
					        int[] nums = { 1, 5, 3, 2, 4, 7, 5, 9, 10, 8 };
 | 
				
			||||||
 | 
					        // 初始化哈希表
 | 
				
			||||||
 | 
					        Map<Integer, Integer> map = new HashMap<>();
 | 
				
			||||||
 | 
					        for (int i = 0; i < nums.length; i++) {
 | 
				
			||||||
 | 
					            map.put(nums[i], i);  // key: 元素,value: 索引
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        int index = hashingSearch(map, target);
 | 
				
			||||||
 | 
					        System.out.println("目标元素 3 的索引 = " + index);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* 哈希查找(链表) */
 | 
				
			||||||
 | 
					        ListNode head = ListNode.arrToLinkedList(nums);
 | 
				
			||||||
 | 
					        // 初始化哈希表
 | 
				
			||||||
 | 
					        Map<Integer, ListNode> map1 = new HashMap<>();
 | 
				
			||||||
 | 
					        while (head != null) {
 | 
				
			||||||
 | 
					            map1.put(head.val, head);  // key: 结点值,value: 结点
 | 
				
			||||||
 | 
					            head = head.next;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        ListNode node = hashingSearch1(map1, target);
 | 
				
			||||||
 | 
					        System.out.println("目标结点值 3 的对应结点对象为 " + node);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										45
									
								
								codes/java/chapter_searching/linear_search.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								codes/java/chapter_searching/linear_search.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,45 @@
 | 
				
			|||||||
 | 
					package chapter_searching;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import include.*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class linear_search {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* 线性查找(数组) */
 | 
				
			||||||
 | 
					    static int linearSearch(int[] nums, int target) {
 | 
				
			||||||
 | 
					        // 遍历数组
 | 
				
			||||||
 | 
					        for (int i = 0; i < nums.length; i++) {
 | 
				
			||||||
 | 
					            // 找到目标元素,返回其索引
 | 
				
			||||||
 | 
					            if (nums[i] == target)
 | 
				
			||||||
 | 
					                return i;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // 未找到目标元素,返回 -1
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* 线性查找(链表) */
 | 
				
			||||||
 | 
					    static ListNode linearSearch(ListNode head, int target) {
 | 
				
			||||||
 | 
					        // 遍历链表
 | 
				
			||||||
 | 
					        while (head != null) {
 | 
				
			||||||
 | 
					            // 找到目标结点,返回之
 | 
				
			||||||
 | 
					            if (head.val == target)
 | 
				
			||||||
 | 
					                return head;
 | 
				
			||||||
 | 
					            head = head.next;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // 未找到目标结点,返回 null
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					        int target = 3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* 在数组中执行线性查找 */
 | 
				
			||||||
 | 
					        int[] nums = { 1, 5, 3, 2, 4, 7, 5, 9, 10, 8 };
 | 
				
			||||||
 | 
					        int index = linearSearch(nums, target);
 | 
				
			||||||
 | 
					        System.out.println("目标元素 3 的索引 = " + index);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* 在链表中执行线性查找 */
 | 
				
			||||||
 | 
					        ListNode head = ListNode.arrToLinkedList(nums);
 | 
				
			||||||
 | 
					        ListNode node = linearSearch(head, target);
 | 
				
			||||||
 | 
					        System.out.println("目标结点值 3 的对应结点对象为 " + node);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										19
									
								
								mkdocs.yml
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								mkdocs.yml
									
									
									
									
									
								
							@ -113,19 +113,19 @@ extra_css:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Page tree
 | 
					# Page tree
 | 
				
			||||||
nav:
 | 
					nav:
 | 
				
			||||||
  - 关于本书:
 | 
					  - 前言:
 | 
				
			||||||
    - chapter_about/index.md
 | 
					    - chapter_introduction/index.md
 | 
				
			||||||
    - 如何使用本书: chapter_about/how_to_read.md
 | 
					  - 如何使用本书: 
 | 
				
			||||||
    - 编程环境安装: chapter_about/installation.md
 | 
					    - 算法学习建议: chapter_prerequisites/suggestions.md
 | 
				
			||||||
    - 一起参与创作: chapter_about/contribution.md
 | 
					    - 编程环境安装: chapter_prerequisites/installation.md
 | 
				
			||||||
    - License: chapter_about/license.md
 | 
					    - 一起参与创作: chapter_prerequisites/contribution.md
 | 
				
			||||||
  - 算法无处不在: 
 | 
					  - 算法是什么: 
 | 
				
			||||||
    - chapter_dsa_introduction/index.md
 | 
					    - chapter_dsa_introduction/index.md
 | 
				
			||||||
  - 计算复杂度:
 | 
					  - 计算复杂度:
 | 
				
			||||||
    - 算法效率评估: chapter_computational_complexity/performance_evaluation.md
 | 
					    - 算法效率评估: chapter_computational_complexity/performance_evaluation.md
 | 
				
			||||||
    - 时间复杂度: chapter_computational_complexity/time_complexity.md
 | 
					    - 时间复杂度: chapter_computational_complexity/time_complexity.md
 | 
				
			||||||
    - 空间复杂度: chapter_computational_complexity/space_complexity.md
 | 
					    - 空间复杂度: chapter_computational_complexity/space_complexity.md
 | 
				
			||||||
    - 权衡时间与空间: chapter_computational_complexity/space_time_tradeoff.md
 | 
					    - 权衡时间与空间 *: chapter_computational_complexity/space_time_tradeoff.md
 | 
				
			||||||
    - 小结: chapter_computational_complexity/summary.md
 | 
					    - 小结: chapter_computational_complexity/summary.md
 | 
				
			||||||
  - 数据结构简介: 
 | 
					  - 数据结构简介: 
 | 
				
			||||||
    - 数据与内存: chapter_data_structure/data_and_memory.md
 | 
					    - 数据与内存: chapter_data_structure/data_and_memory.md
 | 
				
			||||||
@ -134,7 +134,7 @@ nav:
 | 
				
			|||||||
  - 数组与链表: 
 | 
					  - 数组与链表: 
 | 
				
			||||||
    - 数组(Array): chapter_array_and_linkedlist/array.md
 | 
					    - 数组(Array): chapter_array_and_linkedlist/array.md
 | 
				
			||||||
    - 链表(LinkedList): chapter_array_and_linkedlist/linked_list.md
 | 
					    - 链表(LinkedList): chapter_array_and_linkedlist/linked_list.md
 | 
				
			||||||
    - 列表(List): chapter_array_and_linkedlist/list.md
 | 
					    - 列表(List)*: chapter_array_and_linkedlist/list.md
 | 
				
			||||||
    - 小结: chapter_array_and_linkedlist/summary.md
 | 
					    - 小结: chapter_array_and_linkedlist/summary.md
 | 
				
			||||||
  - 栈与队列:
 | 
					  - 栈与队列:
 | 
				
			||||||
    - 栈(Stack): chapter_stack_and_queue/stack.md
 | 
					    - 栈(Stack): chapter_stack_and_queue/stack.md
 | 
				
			||||||
@ -149,6 +149,7 @@ nav:
 | 
				
			|||||||
  - 查找算法:
 | 
					  - 查找算法:
 | 
				
			||||||
    - 线性查找: chapter_searching/linear_search.md
 | 
					    - 线性查找: chapter_searching/linear_search.md
 | 
				
			||||||
    - 二分查找: chapter_searching/binary_search.md
 | 
					    - 二分查找: chapter_searching/binary_search.md
 | 
				
			||||||
 | 
					    - 哈希查找: chapter_searching/hashing_search.md
 | 
				
			||||||
    - 小结: chapter_searching/summary.md
 | 
					    - 小结: chapter_searching/summary.md
 | 
				
			||||||
  - 参考文献:
 | 
					  - 参考文献:
 | 
				
			||||||
    - chapter_reference/index.md
 | 
					    - chapter_reference/index.md
 | 
				
			||||||
		Reference in New Issue
	
	Block a user