冒泡排序算法深度解析:从基础实现到优化策略与面试实战
1. 项目概述为什么我们还在聊冒泡排序在算法面试和日常的编程基础讨论里冒泡排序Bubble Sort大概是那个最常被提起也最容易被“轻视”的算法。很多刚入门的朋友会觉得“这不就是个两层循环把大的往后挪吗太简单了效率又低现在谁还用啊” 这话对但也不全对。没错在动辄处理百万级数据的生产环境中我们几乎不会直接使用冒泡排序。它的时间复杂度是O(n²)在效率上被快速排序、归并排序等算法甩开几条街。但是这绝不意味着冒泡排序失去了它的价值。恰恰相反我认为它是理解算法和编程思想的一块绝佳的“敲门砖”。这个算法的价值远不止于排序本身。它像一面镜子清晰地映照出循环、条件判断、数组操作、算法复杂度分析这些编程核心概念。通过亲手实现一遍冒泡排序你能直观地感受到“算法”是如何一步步操作数据的理解什么是“原地排序”in-place sorting什么是“稳定排序”stable sort。更重要的是它为我们提供了一个完美的起点去探讨更高级的优化技巧比如提前终止、记录最后交换位置甚至作为理解更复杂排序算法如快速排序的分治思想的对比参照。今天我就以一个老码农的视角带你重新拆解冒泡排序不止于背诵代码更要挖出它背后那些常被忽略的细节、踩过的坑以及它在面试和实际思维训练中的妙用。2. 核心原理与基础实现拆解2.1 算法思想像气泡一样上浮冒泡排序的核心思想异常朴素重复地遍历要排序的数列一次比较两个相邻的元素如果它们的顺序错误就把它们交换过来。这个工作的过程就像水底的气泡一点点上浮到水面一样每一轮遍历都会将当前未排序部分中的最大或最小元素“冒泡”到它最终应该所在的位置。我们来打个比方。假设你有一队身高不一的学生需要按身高从矮到高排队。冒泡排序的做法是你从队首开始让第一个和第二个比如果第一个比第二个高就让他们交换位置然后第二个现在可能是原来第一个和第三个比以此类推。这样一轮下来你走到队尾那个最高的学生肯定被换到了最后也就是他正确的位置上。下一轮你只需要在前面的学生中重复这个过程因为最后一个已经排好了。如此反复直到整个队伍有序。这个过程揭示了两个关键点每轮确定一个极值每一趟完整的比较和交换都能保证将当前未排序序列中的最大升序排序时元素“推”到末尾。相邻交换排序过程只交换相邻元素这是算法稳定性的来源相同值的元素在排序后相对位置不变也是它效率不高的原因之一一次交换只能消除一个逆序对。2.2 基础代码实现与逐行解析理论说再多不如一行代码。我们先来看最经典、最“教科书”的C语言实现。我会在每一行后面加上详细的注释解释其意图和潜在陷阱。void bubbleSort(int arr[], int n) { int i, j; // 外层循环控制排序的轮数。n个元素最多需要n-1轮。 for (i 0; i n - 1; i) { // 内层循环负责每一轮中的相邻比较与交换。 // 注意循环条件 j n - i - 1。为什么减1因为每次比较的是arr[j]和arr[j1]。 // 减 i 是因为经过i轮后数组末尾的i个元素已经排好序无需再比较。 for (j 0; j n - i - 1; j) { // 核心比较如果前面的元素比后面的大则交换实现升序排序。 if (arr[j] arr[j1]) { // 交换操作。这里使用了临时变量temp是最经典的交换方法。 int temp arr[j]; arr[j] arr[j1]; arr[j1] temp; } } // 到这里第i轮结束arr[n-i-1]这个位置存放了当前未排序部分的最大值。 } }注意很多新手会写成j n - 1忽略了- i。这会导致内层循环在每一轮都遍历到最后一个元素虽然结果正确但做了大量无意义的比较因为末尾已排序的元素又被比较了一遍降低了效率。这是第一个需要警惕的细节。这个基础版本清晰易懂但它有一个明显的问题即使数组在中间某一轮已经提前完全有序算法仍然会“死板”地执行完所有的 n-1 轮循环。这无疑是巨大的浪费。这就引出了我们的第一个优化点。3. 关键优化策略与性能剖析3.1 优化一引入“有序标志”提前终止这是对基础冒泡排序最经典也最有效的优化常被称为“短冒泡”Short Bubble。思路很简单我们设置一个标志位例如swapped在每一轮内层循环开始前将其置为false。如果在这一轮中发生了至少一次交换就将其置为true。当某一轮内层循环结束后如果swapped仍然是false那就说明整个数组已经有序可以立即终止整个排序过程。void bubbleSortOptimized(int arr[], int n) { int i, j; int swapped; // 有序标志位 for (i 0; i n - 1; i) { swapped 0; // 每轮开始假设已经有序 for (j 0; j n - i - 1; j) { if (arr[j] arr[j1]) { int temp arr[j]; arr[j] arr[j1]; arr[j1] temp; swapped 1; // 发生了交换说明尚未完全有序 } } // 如果这一轮一次交换都没发生提前结束 if (swapped 0) { break; } } }这个优化有多大的效果对于一个已经有序或接近有序的数组这个优化是“革命性”的。最佳情况下数组完全有序只需要进行一轮遍历n-1次比较0次交换就能结束时间复杂度从O(n²)降至O(n)。在实际开发中处理部分有序的数据很常见这个优化能带来显著的性能提升。3.2 优化二记录最后交换位置第一个优化解决了“何时停止”的问题而第二个优化则解决了“每轮比到哪里”的问题。在基础版本中内层循环的边界是n - i - 1这意味着即使后面一大段已经有序我们仍然会“走过场”式地比较它们。更聪明的做法是在每一轮中记录最后一次发生交换的位置lastSwapIndex。在这个位置之后的元素在本轮比较中都没有被交换说明它们已经处于正确的相对顺序对于当前轮的目标——冒泡最大值来说。那么下一轮我们只需要比较到这个位置即可。void bubbleSortOptimized2(int arr[], int n) { int lastSwapIndex n - 1; // 初始边界为数组末尾 int i, j; while (lastSwapIndex 0) { // 当边界大于0时继续 int currentSwapIndex 0; // 记录本轮最后交换的位置 for (j 0; j lastSwapIndex; j) { // 只比较到上一轮的最后交换位置 if (arr[j] arr[j1]) { int temp arr[j]; arr[j] arr[j1]; arr[j1] temp; currentSwapIndex j; // 更新为本轮交换的位置 } } lastSwapIndex currentSwapIndex; // 更新下一轮的边界 // 如果本轮没有交换(currentSwapIndex为0)循环结束 } }这个版本通常被称为“鸡尾酒排序”的单向简化版它动态地缩小了每轮需要扫描的范围。对于某些特定数据例如最小的元素在末尾它能减少不少比较次数。3.3 时间复杂度与空间复杂度深度分析这是面试中的必问题不能只背结论要理解推导过程。时间复杂度最坏与平均情况 O(n²)这是最常被提及的。推导很简单外层循环最多n-1次内层循环在最坏情况下数组完全逆序每次大约执行 n-i-1 次。总比较次数约为 (n-1) (n-2) ... 1 n(n-1)/2属于平方阶。交换次数在最坏情况下也与此同阶。最好情况 O(n)这就是我们优化一带来的效果。当输入数组已经完全有序时优化后的冒泡排序只需进行一轮比较n-1次就会发现没有交换随即终止。所以最好情况是线性时间。空间复杂度 O(1)这是冒泡排序一个非常重要的优点——原地排序。算法只使用了常数级别的额外空间如i,j,temp等临时变量排序直接在原数组上进行不需要额外的数组。这在内存受限的场景下是一个考量因素。稳定性冒泡排序是稳定的排序算法。因为只有当arr[j] arr[j1]时才交换对于相等的元素不会进行交换所以相等元素的相对顺序在排序后保持不变。我们可以用一个表格来对比一下基础版和优化版的性能差异特性基础冒泡排序优化后冒泡排序 (带标志位)说明最坏时间复杂度O(n²)O(n²)对完全逆序数组优化无法减少轮数最好时间复杂度O(n²)O(n)优化版对已有序数组有巨大提升平均时间复杂度O(n²)O(n²)但常数因子更小实际更快空间复杂度O(1)O(1)都是原地排序稳定性稳定稳定核心逻辑未变适用场景教学、极小规模数据教学、对部分有序数据排序生产环境仍不推荐用于大规模数据4. 不同语言下的实现差异与技巧虽然思想一致但在不同编程语言中实现冒泡排序会有一些语法和习惯上的小差异掌握这些能让你写出更地道的代码。4.1 Java实现泛型与Comparable接口在Java中我们更希望排序方法能处理任意可比较的类型而不仅仅是int。这时就需要用到泛型和Comparable接口。public class BubbleSort { // 使用泛型 T并约束 T 必须实现了 Comparable 接口 public static T extends ComparableT void bubbleSort(T[] array) { int n array.length; boolean swapped; for (int i 0; i n - 1; i) { swapped false; for (int j 0; j n - i - 1; j) { // 使用 compareTo 方法进行比较而不是 if (array[j].compareTo(array[j 1]) 0) { // 交换 T temp array[j]; array[j] array[j 1]; array[j 1] temp; swapped true; } } if (!swapped) break; } } // 测试 public static void main(String[] args) { Integer[] numbers {64, 34, 25, 12, 22, 11, 90}; bubbleSort(numbers); System.out.println(Arrays.toString(numbers)); // 输出[11, 12, 22, 25, 34, 64, 90] String[] words {banana, apple, pear, orange}; bubbleSort(words); System.out.println(Arrays.toString(words)); // 输出[apple, banana, orange, pear] } }实操心得在Java中对对象数组进行排序一定要确保对象类正确实现了Comparable接口的compareTo方法否则编译会报错。这是类型安全带来的好处。4.2 Python实现利用语言特性写出更简洁的代码Python的语法非常灵活交换两个变量不需要临时变量这可以让代码更简洁。同时我们可以利用Python的range和len函数。def bubble_sort(arr): 冒泡排序 (Python版) Args: arr (list): 待排序的列表 Returns: list: 排序后的列表 (原地修改也返回) n len(arr) for i in range(n - 1): swapped False # 注意range 生成的是 [0, n-i-1) 的序列正好对应 j 的范围 for j in range(0, n - i - 1): if arr[j] arr[j 1]: # Python 优雅的交换语法 arr[j], arr[j 1] arr[j 1], arr[j] swapped True if not swapped: break return arr # 返回引用符合Python习惯 # 测试 if __name__ __main__: my_list [64, 34, 25, 12, 22, 11, 90] sorted_list bubble_sort(my_list) print(f排序后: {sorted_list}) print(f原列表也被修改: {my_list}) # 两者是同一个对象Python特有的一个坑上面的实现是原地排序修改了原列表。如果你需要保留原列表应该在函数内部先进行拷贝arr arr.copy()。但通常冒泡排序的意义就在于原地操作所以这一点需要根据需求明确。5. 常见面试题与实战陷阱冒泡排序是面试官检验候选人基础是否扎实的经典题目。问题往往不会停留在“写出来”而会深入到细节和变种。5.1 经典面试题剖析手写一个冒泡排序这是最基本的要求。一定要写出优化版本带标志位并主动解释为什么要有这个优化。写的时候注意循环边界大声说出你的思路。时间/空间复杂度是多少为什么不仅要说出O(n²)和O(1)还要能推导出n(n-1)/2这个比较次数并解释最好、最坏、平均情况。对于优化版务必强调最好情况可以到O(n)。冒泡排序是稳定的吗为什么回答“是稳定的”并解释因为只有在前大于后才交换相等时不交换所以相同元素的相对位置不变。冒泡排序和插入排序哪个更快平均情况下两者都是O(n²)但插入排序的常数因子通常更小因为它平均只需要移动一半的数据。对于近乎有序的数组插入排序的优势更明显。但冒泡排序在“检测数组是否已有序”方面有天然优势通过标志位。如何优化冒泡排序这就是展示你知识深度的地方。分点回答提前终止使用swapped标志位。记录边界记录最后一次交换的位置减少下一轮比较范围。双向冒泡鸡尾酒排序奇数轮从左到右冒泡最大偶数轮从右到左冒泡最小适用于类似[2, 3, 4, 5, 1]这种最小元素在末尾的情况。5.2 实战中容易踩的坑数组越界这是最经典的错误。在内层循环中比较的是arr[j]和arr[j1]所以j必须严格小于n-i-1或当前边界。如果写成j n-i-1当j取到最大值时j1就会访问数组之外的内存导致未定义行为或程序崩溃。忽略优化导致性能浪费在技术笔试或面试中如果题目没有明确要求一定要写上优化标志位。这体现了你的工程思维和对性能的基本考量。对复杂数据类型排序时比较逻辑错误在Java/C等语言中对自定义对象排序需要正确定义比较器Comparator或重载比较运算符。如果比较逻辑写反排序结果也会相反。误以为返回值是必须的对于C/C/Java的数组排序函数通常是void类型直接修改传入的数组。而在Python等语言中虽然可以返回列表但本质上也是原地修改。要清楚你写的函数行为是什么。6. 从冒泡排序延伸的算法思维学习冒泡排序绝不能仅仅停留在记忆代码层面。它背后蕴含的算法思维是通往更广阔算法世界的桥梁。6.1 理解“交换排序”家族冒泡排序属于“交换排序”大类。这类算法的核心操作都是通过交换无序元素来达到有序。它的一个著名兄弟是快速排序。你可以这样对比理解冒泡排序每一轮通过相邻交换像冒泡一样把当前最大元素一点一点“推”到正确位置。动作慢但是稳定。快速排序每一轮选择一个“基准”通过跳跃交换把小于基准的扔到左边大于的扔到右边。基准值一下子就跳到了它的最终位置附近。动作迅猛但不稳定。理解了这个对比就能明白为什么快排平均是O(n log n)而冒泡是O(n²)。冒泡排序的每次交换只消除一个相邻逆序对而快排的一次划分可以消除多个不相邻的逆序对。6.2 作为算法教学的起点正因为其简单冒泡排序是讲解以下概念的绝佳示例循环嵌套外层循环控制轮数内层循环完成每轮工作。条件执行与状态标记通过if进行条件交换通过swapped标志位记录状态。数组的遍历与操作如何安全地访问和修改数组元素。算法复杂度通过数“比较”和“交换”的次数直观引入时间复杂度概念。算法优化从最笨的实现到引入“提前终止”再到“记录边界”展示了如何通过观察算法行为来逐步改进它。这是最重要的工程思维训练。6.3 一个有趣的变体鸡尾酒排序鸡尾酒排序Cocktail Sort或称双向冒泡排序是冒泡排序的一个有趣改进。它就像钟摆一样奇数趟从左向右冒泡最大的偶数趟从右向左冒泡最小的。void cocktailSort(int arr[], int n) { int swapped 1; int start 0; int end n - 1; while (swapped) { swapped 0; // 从左到右冒泡最大 for (int i start; i end; i) { if (arr[i] arr[i 1]) { swap(arr[i], arr[i 1]); swapped 1; } } if (!swapped) break; // 如果没有交换提前结束 swapped 0; end--; // 最右端已有序范围缩小 // 从右到左冒泡最小 for (int i end - 1; i start; i--) { if (arr[i] arr[i 1]) { swap(arr[i], arr[i 1]); swapped 1; } } start; // 最左端已有序范围缩小 } }这个算法对于某些特殊序列如[2, 3, 4, 5, 1]比普通冒泡排序更快因为它能同时从两端进行排序。但它并没有改变O(n²)的时间复杂度量级只是减少了某些情况下的常数因子。实现它能帮助你更好地理解冒泡排序中“边界”的概念。7. 总结与个人体会走完这一趟你会发现冒泡排序这个看似简单的算法里面门道其实不少。从最基础的双重循环到引入标志位优化再到记录边界、双向冒泡每一步优化都基于对算法执行过程的细致观察。它就像算法世界里的“Hello World”看似简单却包含了最基本的输入、处理、输出、循环、判断、优化等所有核心要素。我个人在带新人和面试时非常看重对方对冒泡排序的理解。能流畅写出基础版算及格能主动加上优化并解释原因算良好如果能进一步探讨它的稳定性、复杂度推导以及和插入排序等简单排序的对比那基础就算相当扎实了。在真正的项目里我们几乎不会直接调用冒泡排序但这种逐步分析、寻找优化点、权衡利弊的思维模式却是解决任何复杂工程问题都需要的。最后分享一个我自己的小习惯每当学习一个新的、更复杂的排序算法时我都会在心里默默把它和冒泡排序做对比。想想这个新算法是如何解决冒泡排序效率低下这个核心矛盾的是通过分治快排、归并还是选择堆排抑或是其他更巧妙的思路这样对比着学理解会深刻得多。算法学习归根结底是思维方式的训练而冒泡排序无疑是一个极好的起点。

相关新闻

开源Winapp2.ini规则库:打造精准免费的Windows系统清理方案

开源Winapp2.ini规则库:打造精准免费的Windows系统清理方案

在 Windows 系统长期使用后,系统盘空间被各种临时文件、缓存和软件残留占用是开发者和管理员经常遇到的痛点。手动清理不仅效率低下,而且容易误删重要文件。虽然市面上有 CCleaner 等知名工具,但其商业版本需要付费,且部分高级功能…

2026/8/22 12:36:02 阅读更多 →
ORB-SLAM3 MLPnPsolver::Refine()

ORB-SLAM3 MLPnPsolver::Refine()

下面是 MLPnPsolver::Refine() 函数的逐行注释,以及背后数学原理与公式说明。 首先理解函数的作用:在RANSAC过程中,当找到一个比较好的模型(内点数超过历史最佳),会用所有内点重新估计一次位姿,以得到更精确的解。这个过程通常叫做“局部优化”或“Refine”。这里用的是…

2026/8/22 13:00:59 阅读更多 →
独立游戏开发中AI工具合规应用与风险规避指南

独立游戏开发中AI工具合规应用与风险规避指南

最近和几个做独立游戏的朋友聊天,发现一个挺有意思的现象:大家聊起AI工具时,态度变得比以前复杂多了。以前是“哪个AI画图强?”“哪个AI写代码快?”,现在更多是“这个AI生成的内容,平台审核能过…

2026/8/22 12:16:44 阅读更多 →

最新新闻

三步解包微信小程序:unwxapkg 解 wxapkg 工具完整指南

三步解包微信小程序:unwxapkg 解 wxapkg 工具完整指南

三步解包微信小程序:unwxapkg 解 wxapkg 工具完整指南 【免费下载链接】unwxapkg WeChat applet .wxapkg decoding tool 项目地址: https://gitcode.com/gh_mirrors/un/unwxapkg 这篇文章写给从没碰过微信小程序解包、连 .wxapkg 是什么都搞不清的你。我会手…

2026/8/22 14:01:41 阅读更多 →
以太网接口与链路配置实战:从基础参数到链路聚合优化

以太网接口与链路配置实战:从基础参数到链路聚合优化

1. 项目概述:从接口到链路的实战脉络搞网络的人,每天打交道最多的可能就是以太网接口了。从机房里一排排闪烁的交换机端口,到服务器后面板上的网卡,再到你工位下那个不起眼的RJ-45水晶头,这些都是以太网接口的物理呈现…

2026/8/22 14:01:41 阅读更多 →
Java插入排序算法详解:从原理到实战应用与优化

Java插入排序算法详解:从原理到实战应用与优化

1. 项目概述:为什么插入排序是算法入门的“定心丸”刚接触数据结构与算法的朋友,尤其是从Java开始的朋友,常常会被各种排序算法的名字和复杂度公式吓到。冒泡、选择、快速、归并……听起来一个比一个复杂。但如果你问我,在十大经典…

2026/8/22 14:01:41 阅读更多 →
HTTP 5xx服务器错误全解析:从502/504到503,实战排查与架构预防指南

HTTP 5xx服务器错误全解析:从502/504到503,实战排查与架构预防指南

1. 从一次深夜告警说起:为什么5xx错误让人头疼凌晨两点,手机突然开始疯狂震动。打开一看,监控系统里一片飘红,全是“HTTP 500 Internal Server Error”的告警。用户反馈页面打不开,订单提交失败,整个核心业…

2026/8/22 14:01:41 阅读更多 →
SprocketsHandler还是RackHandler?serviceworker-rails双处理器差异、切换与自定义方法完全指南

SprocketsHandler还是RackHandler?serviceworker-rails双处理器差异、切换与自定义方法完全指南

SprocketsHandler还是RackHandler?serviceworker-rails双处理器差异、切换与自定义方法完全指南 【免费下载链接】serviceworker-rails Use Service Worker with the Rails asset pipeline 项目地址: https://gitcode.com/gh_mirrors/se/serviceworker-rails …

2026/8/22 14:01:40 阅读更多 →
2000-2024年全球1km人口密度栅格数据全集

2000-2024年全球1km人口密度栅格数据全集

长时间序列的人口密度栅格数据是解析人类活动时空演进轨迹的核心工具。这套数据能够系统揭示人口分布随时间的动态演变规律,精准识别人口增长、空间迁移、集聚效应与收缩格局的多维模式,为城市规划优化、资源合理配置、环境保护决策、灾害风险预警以及社…

2026/8/22 14:00:40 阅读更多 →

日新闻

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

在电子硬件开发领域,PCB(印制电路板)的沉金工艺是提升产品可靠性和焊接质量的关键环节。对于需要高密度互连、长期稳定运行或高频信号传输的板卡,如“黍姐仿通行证”这类可能涉及身份识别、数据交互的硬件项目,选择正确…

2026/8/22 0:00:11 阅读更多 →
电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

这次我们来看一个针对电气考研电路科目的学习规划项目。它不是软件工具,而是一套聚焦于8月份关键节点的备考策略。对于电气工程考研的同学来说,电路分析是专业课的重中之重,也是拉开分差的关键。进入8月,复习进入强化阶段&#xf…

2026/8/22 0:00:11 阅读更多 →
消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

大家好,我是专注于前端开发与AI工具实践的技术博主。在日常使用 Claude Code 等AI编程助手时,你是否也遇到过这样的困扰:生成的代码功能上没问题,但代码风格、组件设计、交互逻辑总透着一股“AI味”——布局单调、样式简陋、交互生…

2026/8/22 0:00:11 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/22 8:09:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/21 16:42:28 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/22 7:31:03 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →