slug
type
status
category
summary
date
tags
password
icon

Binary Search

 
 
  1. Code
 
  1. 代码分析
这段代码是一个用Java语言编写的二分查找算法的实现。它包含一个名为BinarySearch的类和该类中的一个静态方法recursiveBinarySearch,此外还有一个main方法用于执行查找过程并打印结果。以下是代码的详细解释:
  1. 方法定义
      • public static int recursiveBinarySearch(int[] arr, int low, int high, int key): 这是一个静态方法,接收四个参数:一个整数数组arr,两个表示搜索范围的整数lowhigh,以及要在数组中查找的键值key
  1. 递归终止条件
      • if (high < low): 如果high小于low,表示搜索的范围无效,这时候将返回1,代表没有找到键值。
  1. 计算中间索引
      • int mid = low + (high - low) / 2: 计算中间位置的索引mid,这样可以将数组分为两个部分进行查找。
  1. 判断和递归搜索
      • if (key == arr[mid]): 如果中间位置的元素正好是要查找的键值,那么返回该位置的索引。
      • else if (key < arr[mid]): 如果键值小于中间位置的元素,说明要查找的键值在左侧的子数组中,因此递归调用recursiveBinarySearch方法,将搜索范围修改为从lowmid - 1
      • else: 如果键值大于中间位置的元素,说明要查找的键值在右侧的子数组中,因此递归调用recursiveBinarySearch方法,将搜索范围修改为从mid + 1high
  1. 主方法(main)的执行流程
      • 定义一个已排序的数组array和要查找的键值key
      • 调用recursiveBinarySearch方法进行查找。
      • 根据返回的结果result,判断键值是否存在于数组中,并打印相应的消息。如果result等于1,打印“Element not present in the array”;否则,打印“Element found at index: ”加上找到的索引值。
这个程序展示了如何使用递归方法实现二分查找算法,在已排序的数组中高效地查找特定元素。

Merge Sort

 
 
代码分析:
这段代码实现了 归并排序(Merge Sort) 算法。归并排序是一种分治法(Divide and Conquer)的经典应用,下面是代码功能的详细分析:

核心逻辑与实现

1. merge 方法:合并两个有序子数组

  • 作用: 将数组 arr 的两个有序部分 [l..m][m+1..r] 合并为一个有序数组。
  • 步骤
      1. 计算两个子数组的长度:n1 = m - l + 1n2 = r - m
      1. 创建临时数组 LR,分别存储左右两个子数组的数据。
      1. LR 中的数据按顺序复制回原数组 arr
      1. 用两个指针 ij 分别遍历临时数组 LR,比较它们的值,将较小值复制到 arr[k]
      1. 如果一个子数组的数据已经全部复制完,则将另一个子数组的剩余数据直接复制到 arr

2. sort 方法:递归地分割数组并排序

  • 作用: 将数组 arr[l..r] 递归分割成小数组,排序后调用 merge 方法合并。
  • 步骤
      1. 判断 l < r 是否成立(数组长度是否大于 1)。
      1. 找到中间点 m = (l + r) / 2
      1. 递归调用 sort 方法对左半部分 arr[l..m] 和右半部分 arr[m+1..r] 进行排序。
      1. 调用 merge 方法,将两个已排序的子数组合并。

3. printArray 方法:打印数组

  • 作用: 遍历数组并打印其元素,用于显示排序前后数组的内容。

4. main 方法:程序入口

  • 作用
      1. 定义一个待排序的数组。
      1. 打印初始数组内容。
      1. 调用 sort 方法对数组进行排序。
      1. 打印排序后的数组。

程序运行逻辑

  1. 输入arr = {12, 11, 13, 5, 6, 7}
  1. 分治过程
      • 第一次分割:{12, 11, 13}{5, 6, 7}
      • 第二次分割:{12, 11}{13}{5, 6}{7}
      • 第三次分割:{12}{11}{5}{6}
  1. 合并过程
      • 合并 {12}{11}{11, 12}
      • 合并 {5}{6}{5, 6}
      • 合并 {11, 12}{13}{11, 12, 13}
      • 合并 {5, 6}{7}{5, 6, 7}
      • 合并 {11, 12, 13}{5, 6, 7}{5, 6, 7, 11, 12, 13}
  1. 输出

    归并排序的特点

    1. 时间复杂度
        • 最佳情况、最坏情况和平均情况均为 。
          • O(nlog⁡n)O(n \log n)
    1. 空间复杂度
        • 需要额外的存储空间来创建临时数组 和 ,因此空间复杂度为 。
          • LL
            RR
            O(n)O(n)
    1. 稳定性
        • 归并排序是稳定的排序算法,因为相等元素在合并时不会交换顺序。

    改进建议

    1. 减少内存分配
        • 当前代码中每次合并时都重新创建临时数组 LR,可以考虑复用数组来减少内存开销。
    1. 非递归实现
        • 可以使用迭代方法(自底向上)来实现归并排序,避免递归带来的栈内存开销。
    如果还有其他疑问,欢迎进一步讨论!
     
    AP CSA: RecursionAn introduction to Java
    Loading...
    现代数学启蒙
    现代数学启蒙
    推广现代数学🍚
    最新发布
    Java Quick Reference
    2025-2-14
    CSA UNIT 4: Iteration
    2025-2-13
    CSA UNIT 3: Boolean Expressions and if Statements
    2025-2-13
    CSA UNIT 2: Using Objects
    2025-2-13
    CSA Unit 5: Writing Classes
    2025-2-13
    2025 CSA  Quick Review
    2025-2-11
    公告
    🎉现代数学启蒙(MME:Modern Mathematics Enlightenment)欢迎您🎉
    -- 感谢您的支持 ---