[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-erfenchazhaosuanfaheshilijieshao":3},{"id":4,"title":5,"slug":6,"summary":7,"content":8,"contentHtml":9,"wordCount":10,"readingTime":11,"categoryId":12,"tags":13,"coverImage":13,"thumbnail":13,"status":14,"isTop":15,"isRecommended":15,"allowComments":15,"password":13,"viewCount":16,"likeCount":15,"commentCount":15,"seoTitle":5,"seoKeywords":17,"seoDescription":18,"source":13,"sourceUrl":13,"publishTime":19},"2008024308121661442","二分查找算法和实例介绍","erfenchazhaosuanfaheshilijieshao","### **1. 核心思想** 二分算法是一种高效的搜索算法，适用于**有序数组**，通过**分治策略**逐步缩小搜索范围。其核心思想是： - 将数组分为两半，比较目标值与中间元素的大小关系； - 根据比较结果，决定继续在左半部分或右半部分搜索； - 重复此过程，直到找到目标值或确定其不存在。 --- ### **2. 使用前提** - **数组必须有序**（升序或降序）。 - 适用于静态数据（无需频繁插入\u002F删除），因动态数据维护有序性成本较高。 --- ### **3. 算法步骤** 以升序数组为例，查找目标值 `target`： 1. **初始化**：定义两个指针 `low`（起始位置）和 `high`（结束位置）。 - 通常 `low = 0`，`high = 数组长度 - 1`。 2. **循环条件**：当 `low \u003C= high` 时继续循环。 3.","### **1. 核心思想**\n二分算法是一种高效的搜索算法，适用于**有序数组**，通过**分治策略**逐步缩小搜索范围。其核心思想是：\n- 将数组分为两半，比较目标值与中间元素的大小关系；\n- 根据比较结果，决定继续在左半部分或右半部分搜索；\n- 重复此过程，直到找到目标值或确定其不存在。\n\n---\n\n### **2. 使用前提**\n- **数组必须有序**（升序或降序）。\n- 适用于静态数据（无需频繁插入\u002F删除），因动态数据维护有序性成本较高。\n\n---\n\n### **3. 算法步骤**\n以升序数组为例，查找目标值 `target`：\n1. **初始化**：定义两个指针 `low`（起始位置）和 `high`（结束位置）。  \n   - 通常 `low = 0`，`high = 数组长度 - 1`。\n2. **循环条件**：当 `low \u003C= high` 时继续循环。\n3. **计算中间位置**：  \n   `mid = (low + high) \u002F 2`（或 `mid = low + (high - low) \u002F 2` 避免溢出）。\n4. **比较中间元素**：\n   - 若 `arr[mid] == target`：返回索引 `mid`。\n   - 若 `arr[mid] > target`：目标在左侧，更新 `high = mid - 1`。\n   - 若 `arr[mid] \u003C target`：目标在右侧，更新 `low = mid + 1`。\n5. **结束条件**：若 `low > high`，说明未找到目标值，返回 `-1`。\n\n---\n\n### **4. 时间复杂度**\n- **时间复杂度**：`O(log n)`，其中 `n` 为数组长度。  \n  - 每次比较可排除一半数据，效率远高于线性查找的 `O(n)`。\n- **空间复杂度**：`O(1)`（原地查找，无需额外空间）。\n\n---\n\n### **5. 应用场景**\n- **基础查找**：在有序数组中快速定位目标值。\n- **变体问题**：\n  - 查找第一个大于等于\u002F小于等于目标值的位置（`lower_bound`\u002F`upper_bound`）。\n  - 计算目标值的出现次数。\n- **优化问题**：如求解函数极值、最小化最大值等问题。\n\n---\n\n### **6. 常见实现模板**\n#### **模板1：标准二分查找**\n```java\npublic static int binarySearch(int[] arr, int target) {\n    int low = 0, high = arr.length - 1;\n    while (low \u003C= high) {\n        int mid = low + (high - low) \u002F 2; \u002F\u002F 防溢出\n        if (arr[mid] == target) return mid;\n        else if (arr[mid] > target) high = mid - 1;\n        else low = mid + 1;\n    }\n    return -1;\n}\n```\n\n#### **模板2：查找左边界（lower_bound）**\n```java\npublic static int lowerBound(int[] arr, int target) {\n    int low = 0, high = arr.length - 1;\n    while (low \u003C high) {\n        int mid = low + (high - low) \u002F 2;\n        if (arr[mid] >= target) high = mid;\n        else low = mid + 1;\n    }\n    return low;\n}\n```\n\n---\n\n### **7. 注意事项**\n1. **死循环问题**：\n   - 循环条件需与 `low`\u002F`high` 更新方式匹配。例如：\n     - 若使用 `while (low \u003C high)`，则需确保每次循环都能缩小范围。\n2. **中间值计算**：\n   - 使用 `mid = low + (high - low) \u002F 2` 避免整数溢出（尤其在大型数组中）。\n3. **边界处理**：\n   - 需明确 `low`\u002F`high` 的更新逻辑（是否包含 `mid`），防止漏掉可能解。\n\n---\n\n### **8. 实例演示**\n假设数组为 `[1, 5, 10, 19, 21, 28, 30, 31, 78, 92]`，查找 `28`：\n1. 初始 `low=0`, `high=9` → `mid=4`, `arr[4]=21 \u003C 28` → 更新 `low=5`。\n2. `low=5`, `high=9` → `mid=7`, `arr[7]=31 > 28` → 更新 `high=6`。\n3. `low=5`, `high=6` → `mid=5`, `arr[5]=28 == 28` → 返回索引 `5`。\n\n---\n\n### **9. 局限性**\n- **仅适用于有序数据**：若数据无序，需先排序（时间复杂度 `O(n log n)`）。\n- **不适用于链表**：链表无法高效随机访问中间元素。\n\n---\n\n### **总结**\n二分算法是高效查找的核心工具，但需注意实现细节（如边界处理、死循环）。掌握其思想及常见变体（如左\u002F右边界查找），可快速解决大量实际问题。","\u003Ch3 data-line=\"0\" id=\"1. 核心思想\">\u003Cstrong>1. 核心思想\u003C\u002Fstrong>\u003C\u002Fh3>\n\u003Cp data-line=\"1\">二分算法是一种高效的搜索算法，适用于\u003Cstrong>有序数组\u003C\u002Fstrong>，通过\u003Cstrong>分治策略\u003C\u002Fstrong>逐步缩小搜索范围。其核心思想是：\u003C\u002Fp>\n\u003Cul data-line=\"2\">\n\u003Cli data-line=\"2\">将数组分为两半，比较目标值与中间元素的大小关系；\u003C\u002Fli>\n\u003Cli data-line=\"3\">根据比较结果，决定继续在左半部分或右半部分搜索；\u003C\u002Fli>\n\u003Cli data-line=\"4\">重复此过程，直到找到目标值或确定其不存在。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr data-line=\"6\">\n\u003Ch3 data-line=\"8\" id=\"2. 使用前提\">\u003Cstrong>2. 使用前提\u003C\u002Fstrong>\u003C\u002Fh3>\n\u003Cul data-line=\"9\">\n\u003Cli data-line=\"9\">\u003Cstrong>数组必须有序\u003C\u002Fstrong>（升序或降序）。\u003C\u002Fli>\n\u003Cli data-line=\"10\">适用于静态数据（无需频繁插入\u002F删除），因动态数据维护有序性成本较高。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr data-line=\"12\">\n\u003Ch3 data-line=\"14\" id=\"3. 算法步骤\">\u003Cstrong>3. 算法步骤\u003C\u002Fstrong>\u003C\u002Fh3>\n\u003Cp data-line=\"15\">以升序数组为例，查找目标值 \u003Ccode>target\u003C\u002Fcode>：\u003C\u002Fp>\n\u003Col data-line=\"16\">\n\u003Cli data-line=\"16\">\u003Cstrong>初始化\u003C\u002Fstrong>：定义两个指针 \u003Ccode>low\u003C\u002Fcode>（起始位置）和 \u003Ccode>high\u003C\u002Fcode>（结束位置）。\n\u003Cul data-line=\"17\">\n\u003Cli data-line=\"17\">通常 \u003Ccode>low = 0\u003C\u002Fcode>，\u003Ccode>high = 数组长度 - 1\u003C\u002Fcode>。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli data-line=\"18\">\u003Cstrong>循环条件\u003C\u002Fstrong>：当 \u003Ccode>low &lt;= high\u003C\u002Fcode> 时继续循环。\u003C\u002Fli>\n\u003Cli data-line=\"19\">\u003Cstrong>计算中间位置\u003C\u002Fstrong>：\u003Cbr>\n\u003Ccode>mid = (low + high) \u002F 2\u003C\u002Fcode>（或 \u003Ccode>mid = low + (high - low) \u002F 2\u003C\u002Fcode> 避免溢出）。\u003C\u002Fli>\n\u003Cli data-line=\"21\">\u003Cstrong>比较中间元素\u003C\u002Fstrong>：\n\u003Cul data-line=\"22\">\n\u003Cli data-line=\"22\">若 \u003Ccode>arr[mid] == target\u003C\u002Fcode>：返回索引 \u003Ccode>mid\u003C\u002Fcode>。\u003C\u002Fli>\n\u003Cli data-line=\"23\">若 \u003Ccode>arr[mid] &gt; target\u003C\u002Fcode>：目标在左侧，更新 \u003Ccode>high = mid - 1\u003C\u002Fcode>。\u003C\u002Fli>\n\u003Cli data-line=\"24\">若 \u003Ccode>arr[mid] &lt; target\u003C\u002Fcode>：目标在右侧，更新 \u003Ccode>low = mid + 1\u003C\u002Fcode>。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli data-line=\"25\">\u003Cstrong>结束条件\u003C\u002Fstrong>：若 \u003Ccode>low &gt; high\u003C\u002Fcode>，说明未找到目标值，返回 \u003Ccode>-1\u003C\u002Fcode>。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr data-line=\"27\">\n\u003Ch3 data-line=\"29\" id=\"4. 时间复杂度\">\u003Cstrong>4. 时间复杂度\u003C\u002Fstrong>\u003C\u002Fh3>\n\u003Cul data-line=\"30\">\n\u003Cli data-line=\"30\">\u003Cstrong>时间复杂度\u003C\u002Fstrong>：\u003Ccode>O(log n)\u003C\u002Fcode>，其中 \u003Ccode>n\u003C\u002Fcode> 为数组长度。\n\u003Cul data-line=\"31\">\n\u003Cli data-line=\"31\">每次比较可排除一半数据，效率远高于线性查找的 \u003Ccode>O(n)\u003C\u002Fcode>。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli data-line=\"32\">\u003Cstrong>空间复杂度\u003C\u002Fstrong>：\u003Ccode>O(1)\u003C\u002Fcode>（原地查找，无需额外空间）。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr data-line=\"34\">\n\u003Ch3 data-line=\"36\" id=\"5. 应用场景\">\u003Cstrong>5. 应用场景\u003C\u002Fstrong>\u003C\u002Fh3>\n\u003Cul data-line=\"37\">\n\u003Cli data-line=\"37\">\u003Cstrong>基础查找\u003C\u002Fstrong>：在有序数组中快速定位目标值。\u003C\u002Fli>\n\u003Cli data-line=\"38\">\u003Cstrong>变体问题\u003C\u002Fstrong>：\n\u003Cul data-line=\"39\">\n\u003Cli data-line=\"39\">查找第一个大于等于\u002F小于等于目标值的位置（\u003Ccode>lower_bound\u003C\u002Fcode>\u002F\u003Ccode>upper_bound\u003C\u002Fcode>）。\u003C\u002Fli>\n\u003Cli data-line=\"40\">计算目标值的出现次数。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli data-line=\"41\">\u003Cstrong>优化问题\u003C\u002Fstrong>：如求解函数极值、最小化最大值等问题。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr data-line=\"43\">\n\u003Ch3 data-line=\"45\" id=\"6. 常见实现模板\">\u003Cstrong>6. 常见实现模板\u003C\u002Fstrong>\u003C\u002Fh3>\n\u003Ch4 data-line=\"46\" id=\"模板1：标准二分查找\">\u003Cstrong>模板1：标准二分查找\u003C\u002Fstrong>\u003C\u002Fh4>\n\n        \u003Cdetails  data-line=\"47\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">binarySearch\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(\u003Cspan class=\"hljs-type\">int\u003C\u002Fspan>[] arr, \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> target)\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">low\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>, high = arr.length - \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>;\n    \u003Cspan class=\"hljs-keyword\">while\u003C\u002Fspan> (low &lt;= high) {\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">mid\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> low + (high - low) \u002F \u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>; \u003Cspan class=\"hljs-comment\">\u002F\u002F 防溢出\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (arr[mid] == target) \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> mid;\n        \u003Cspan class=\"hljs-keyword\">else\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (arr[mid] &gt; target) high = mid - \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>;\n        \u003Cspan class=\"hljs-keyword\">else\u003C\u002Fspan> low = mid + \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>;\n    }\n    \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> -\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>;\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch4 data-line=\"60\" id=\"模板2：查找左边界（lower_bound）\">\u003Cstrong>模板2：查找左边界（lower_bound）\u003C\u002Fstrong>\u003C\u002Fh4>\n\n        \u003Cdetails  data-line=\"61\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">lowerBound\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(\u003Cspan class=\"hljs-type\">int\u003C\u002Fspan>[] arr, \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> target)\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">low\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>, high = arr.length - \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>;\n    \u003Cspan class=\"hljs-keyword\">while\u003C\u002Fspan> (low &lt; high) {\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">mid\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> low + (high - low) \u002F \u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (arr[mid] &gt;= target) high = mid;\n        \u003Cspan class=\"hljs-keyword\">else\u003C\u002Fspan> low = mid + \u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>;\n    }\n    \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> low;\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Chr data-line=\"73\">\n\u003Ch3 data-line=\"75\" id=\"7. 注意事项\">\u003Cstrong>7. 注意事项\u003C\u002Fstrong>\u003C\u002Fh3>\n\u003Col data-line=\"76\">\n\u003Cli data-line=\"76\">\u003Cstrong>死循环问题\u003C\u002Fstrong>：\n\u003Cul data-line=\"77\">\n\u003Cli data-line=\"77\">循环条件需与 \u003Ccode>low\u003C\u002Fcode>\u002F\u003Ccode>high\u003C\u002Fcode> 更新方式匹配。例如：\n\u003Cul data-line=\"78\">\n\u003Cli data-line=\"78\">若使用 \u003Ccode>while (low &lt; high)\u003C\u002Fcode>，则需确保每次循环都能缩小范围。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli data-line=\"79\">\u003Cstrong>中间值计算\u003C\u002Fstrong>：\n\u003Cul data-line=\"80\">\n\u003Cli data-line=\"80\">使用 \u003Ccode>mid = low + (high - low) \u002F 2\u003C\u002Fcode> 避免整数溢出（尤其在大型数组中）。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli data-line=\"81\">\u003Cstrong>边界处理\u003C\u002Fstrong>：\n\u003Cul data-line=\"82\">\n\u003Cli data-line=\"82\">需明确 \u003Ccode>low\u003C\u002Fcode>\u002F\u003Ccode>high\u003C\u002Fcode> 的更新逻辑（是否包含 \u003Ccode>mid\u003C\u002Fcode>），防止漏掉可能解。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr data-line=\"84\">\n\u003Ch3 data-line=\"86\" id=\"8. 实例演示\">\u003Cstrong>8. 实例演示\u003C\u002Fstrong>\u003C\u002Fh3>\n\u003Cp data-line=\"87\">假设数组为 \u003Ccode>[1, 5, 10, 19, 21, 28, 30, 31, 78, 92]\u003C\u002Fcode>，查找 \u003Ccode>28\u003C\u002Fcode>：\u003C\u002Fp>\n\u003Col data-line=\"88\">\n\u003Cli data-line=\"88\">初始 \u003Ccode>low=0\u003C\u002Fcode>, \u003Ccode>high=9\u003C\u002Fcode> → \u003Ccode>mid=4\u003C\u002Fcode>, \u003Ccode>arr[4]=21 &lt; 28\u003C\u002Fcode> → 更新 \u003Ccode>low=5\u003C\u002Fcode>。\u003C\u002Fli>\n\u003Cli data-line=\"89\">\u003Ccode>low=5\u003C\u002Fcode>, \u003Ccode>high=9\u003C\u002Fcode> → \u003Ccode>mid=7\u003C\u002Fcode>, \u003Ccode>arr[7]=31 &gt; 28\u003C\u002Fcode> → 更新 \u003Ccode>high=6\u003C\u002Fcode>。\u003C\u002Fli>\n\u003Cli data-line=\"90\">\u003Ccode>low=5\u003C\u002Fcode>, \u003Ccode>high=6\u003C\u002Fcode> → \u003Ccode>mid=5\u003C\u002Fcode>, \u003Ccode>arr[5]=28 == 28\u003C\u002Fcode> → 返回索引 \u003Ccode>5\u003C\u002Fcode>。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr data-line=\"92\">\n\u003Ch3 data-line=\"94\" id=\"9. 局限性\">\u003Cstrong>9. 局限性\u003C\u002Fstrong>\u003C\u002Fh3>\n\u003Cul data-line=\"95\">\n\u003Cli data-line=\"95\">\u003Cstrong>仅适用于有序数据\u003C\u002Fstrong>：若数据无序，需先排序（时间复杂度 \u003Ccode>O(n log n)\u003C\u002Fcode>）。\u003C\u002Fli>\n\u003Cli data-line=\"96\">\u003Cstrong>不适用于链表\u003C\u002Fstrong>：链表无法高效随机访问中间元素。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr data-line=\"98\">\n\u003Ch3 data-line=\"100\" id=\"总结\">\u003Cstrong>总结\u003C\u002Fstrong>\u003C\u002Fh3>\n\u003Cp data-line=\"101\">二分算法是高效查找的核心工具，但需注意实现细节（如边界处理、死循环）。掌握其思想及常见变体（如左\u002F右边界查找），可快速解决大量实际问题。\u003C\u002Fp>\n",1858,6,"0","",2,0,102,"查找,数组,low,high,目标值","1. 核心思想\n二分算法是一种高效的搜索算法，适用于有序数组，通过分治策略逐步缩小搜索范围。其核心思想是：\n\n将数组分为两半，比较目标值与中间元素的大小关系；\n根据比较结果，决定继续在左半部分或右半部分搜索；\n重复此过程，直到找到目标值或确定其不存在。\n\n\n2. 使用前提\n\n数组必须有序（升序或降序）。\n适用于静态数据（无需频繁插入\u002F删除），因动态数据维护有序性成本较高。\n\n\n3.","2026-01-05 11:54:36"]