C++十大经典排序算法实现:从原理到性能优化全解析
1. 项目概述与核心价值作为一名在C领域摸爬滚打了十多年的老码农我始终认为排序算法是程序员内功修炼的“马步”。无论你是刚接触C的新手还是准备面试的求职者亦或是想夯实基础的中级开发者亲手用C实现一遍十大经典排序算法其价值远超你的想象。这不仅仅是完成一个编程练习更是一次对计算机科学核心思想、C语言特性以及性能优化思维的深度探索。当你能够清晰地解释为什么快速排序在平均情况下那么快或者为什么归并排序是外部排序的基石时你对程序的理解就已经上了一个台阶。这个项目就是用C这门兼具高性能与抽象能力的语言将冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序这十大算法从理论上的伪代码变成可以编译、运行、测试的真实代码。在这个过程中你会反复用到数组、指针、引用、函数模板、递归、迭代器、标准库容器等C核心概念并直面时间与空间复杂度的权衡。最终你得到的不仅是一份代码仓库更是一套属于自己的、关于“如何高效组织数据”的思维模型。接下来我将带你从设计思路到代码细节从原理剖析到避坑指南完整走一遍这个极具价值的实践之旅。2. 整体设计与实现思路拆解在动手敲代码之前理清整体架构和设计思路至关重要。我们不能简单地写十个孤立的函数而应该构建一个可测试、可比较、可扩展的框架。2.1 核心设计目标与接口抽象我们的核心目标是实现算法逻辑的纯粹性同时提供统一的测试和比较接口。这意味着排序算法的实现应专注于算法本身而将数据准备、结果验证、性能测试等外围工作剥离出来。为此我设计了一个基于函数模板和迭代器的通用接口。为什么不直接用std::vectorT作为参数因为使用迭代器RandomIt begin, RandomIt end更具通用性和C风格。它不仅可以用于标准容器如vector,deque,array也可以用于原生数组这使得我们的算法实现更贴近STL的设计哲学。templatetypename RandomIt void bubble_sort(RandomIt first, RandomIt last);每个排序函数都遵循这个模式。RandomIt要求迭代器是随机访问迭代器因为大多数排序算法需要随机访问元素如快速排序的partition。对于桶排序和基数排序这类非比较排序我们可能需要额外的参数来指定范围或基数但核心接口保持一致。2.2 测试框架与数据驱动为了验证算法的正确性和比较性能我们需要一个强大的测试框架。我通常会做以下几件事正确性测试使用小规模随机数据、已排序数据、逆序数据、包含重复元素的数据进行测试并与std::sort的结果进行比对。性能测试使用大规模随机数据例如10万、100万个整数在Release模式下开启编译器优化测量每个算法的运行时间。这里使用chrono库。稳定性测试对于声称稳定的排序算法如归并排序、插入排序需要测试其对相等元素原始顺序的保持能力。我会构建一个SorterTester类它负责生成各种测试用例调用不同的排序算法并记录结果。数据驱动的方式让我们能轻松增加新的测试场景。2.3 算法分类与实现策略十大排序算法可以分为两大类比较排序通过比较元素间的大小来决定次序。包括冒泡、选择、插入、希尔、归并、快速、堆排序。它们的时间复杂度下界是O(n log n)。非比较排序不通过直接比较而是利用数据的特定属性如整数值范围、位数。包括计数、桶、基数排序。它们可以突破O(n log n)的下界达到线性时间复杂度O(n)但对输入数据有额外要求。在实现时比较排序的重点是高效地比较和交换元素而非比较排序的重点是如何利用辅助空间桶、计数器来收集和重组数据。理解这个根本区别是实现时不出错的关键。3. 核心算法原理与C实现细节接下来我们深入每个算法的核心并用C代码将其实现。我会重点讲解那些容易出错或需要巧妙处理的细节。3.1 简单排序算法冒泡、选择、插入这三种是入门算法但实现上仍有讲究。冒泡排序核心是依次比较相邻元素将大的“冒泡”到后面。一个常见的优化是使用swapped标志位记录本轮是否发生交换如果某一轮没有交换说明数组已有序可以提前终止。templatetypename RandomIt void bubble_sort(RandomIt first, RandomIt last) { if (first last) return; for (auto i first; i ! last; i) { bool swapped false; for (auto j first; j last - 1 - (i - first); j) { if (*(j1) *j) { // 注意使用 而非 以保证稳定性如果相等不交换 std::iter_swap(j, j1); swapped true; } } if (!swapped) break; // 提前终止优化 } }注意内层循环的终止条件j last - 1 - (i - first)很关键。(i - first)表示已完成的轮数每一轮都会将当前未排序部分的最大元素推到正确位置所以后续轮次无需再比较它们。选择排序每次从未排序部分选择最小或最大元素放到已排序部分的末尾。它的不稳定版本实现简单但如何实现稳定的选择排序是一个小挑战。不稳定版本直接交换元素会打乱顺序。稳定版本需要将最小元素插入到已排序末尾其后的元素依次后移但这使得时间复杂度变为O(n²)失去了选择排序“减少交换次数”的优势。通常我们实现的是不稳定版本。插入排序将待排序元素插入到已排序序列的适当位置。对于近乎有序的数组插入排序效率极高。实现时通常采用从后向前扫描已排序部分的方式。templatetypename RandomIt void insertion_sort(RandomIt first, RandomIt last) { if (first last) return; for (auto i first 1; i ! last; i) { auto key std::move(*i); // 移动语义避免不必要的拷贝 auto j i; while (j first key *(j-1)) { *j std::move(*(j-1)); // 向后移动元素 --j; } *j std::move(key); // 插入 } }实操心得在内部循环中使用std::move可以提升性能尤其是当排序对象是自定义类如包含字符串的类时。这体现了C“零开销抽象”的思想。3.2 高级比较排序希尔、归并、快速、堆排序这四种算法是面试和实际应用中的常客。希尔排序是插入排序的改进版通过引入“间隔序列”对相距较远的元素进行预处理使数组逐步接近有序。关键在于间隔序列的选择。我常用的是Knuth序列h 3*h 1或Sedgewick序列。希尔排序的实现像是插入排序的外层套了一个间隔循环。归并排序典型的分治算法。实现上的核心难点在于合并两个有序序列。需要额外的O(n)空间。递归实现清晰但为了优化通常会在子序列长度小于某个阈值如16时切换到插入排序因为对于小数组插入排序的常数因子更小。迭代自底向上的归并排序可以避免递归开销但代码稍复杂。// 合并操作 templatetypename RandomIt void merge(RandomIt first, RandomIt mid, RandomIt last) { std::vectortypename std::iterator_traitsRandomIt::value_type temp; temp.reserve(std::distance(first, last)); // 预分配空间避免多次扩容 auto left first, right mid; while (left ! mid right ! last) { if (*right *left) { // 注意这里用 *right *left 保证了稳定性相等时取左边 temp.push_back(std::move(*right)); } else { temp.push_back(std::move(*left)); } } temp.insert(temp.end(), left, mid); temp.insert(temp.end(), right, last); std::move(temp.begin(), temp.end(), first); }快速排序另一个分治算法核心是分区操作。选主元pivot的策略直接影响性能。常见策略有取第一个元素对已排序数组极差、随机选取、三数取中。我推荐“三数取中法”它能有效避免最坏情况。分区过程也有多种写法Lomuto partition, Hoare partition。Hoare分区通常更高效但理解起来稍难。// 三数取中法选择主元 templatetypename RandomIt RandomIt median_of_three(RandomIt first, RandomIt last) { auto mid first (last - first) / 2; if (*last *first) std::iter_swap(first, last); if (*mid *first) std::iter_swap(mid, first); if (*last *mid) std::iter_swap(last, mid); return mid; // 此时 *first *mid *last返回中间值的位置 } // 快速排序主函数递归 templatetypename RandomIt void quick_sort(RandomIt first, RandomIt last) { if (std::distance(first, last) 1) return; if (std::distance(first, last) 16) { // 小数组优化 insertion_sort(first, last); return; } auto pivot_iter median_of_three(first, last-1); std::iter_swap(pivot_iter, last-1); // 将主元放到末尾 auto partition_point hoare_partition(first, last-1); quick_sort(first, partition_point); quick_sort(partition_point 1, last); }堆排序利用“二叉堆”这种数据结构进行排序。步骤是1) 将数组构建成最大堆2) 重复将堆顶最大值与堆末尾元素交换并缩小堆范围重新调整堆。构建堆的过程可以从最后一个非叶子节点开始自底向上进行heapify。堆排序是不稳定排序。templatetypename RandomIt void heap_sort(RandomIt first, RandomIt last) { if (first last) return; // 1. 构建最大堆 for (auto i first (last - first)/2 - 1; i first; --i) { heapify(first, last, i); } // 2. 逐个提取元素 for (auto end last - 1; end first; --end) { std::iter_swap(first, end); heapify(first, end, first); } } // heapify 函数确保以 i 为根的子树满足堆性质3.3 非比较排序计数、桶、基数排序这些算法在特定场景下威力巨大。计数排序适用于整数范围已知且范围不大的情况。需要创建一个长度为(max_val - min_val 1)的计数数组。步骤1) 统计每个元素出现次数2) 将计数数组累加得到每个元素的最终位置索引3) 从后向前遍历原数组从后向前是为了保持稳定性根据计数数组放置元素到输出数组。关键细节处理负数或非零最小值。我们的计数数组索引应该是element - min_val而不是element。这能正确处理负数范围。桶排序假设输入数据均匀分布在一定区间内。将区间划分为n个桶将数据分到各个桶对每个桶内部排序可用插入排序最后合并。桶的数量和映射函数是关键。在C中我们可以用std::vectorstd::vectorT来表示桶。基数排序针对整数或字符串按位或按字符进行排序。可以从最低位开始LSD也可以从最高位开始MSD。LSD实现更简单且是稳定的。它通常使用计数排序作为其子程序对每一位进行计数排序。基数r的选择比如10进制或2的幂次如256会影响时间和空间。// LSD基数排序针对非负整数 templatetypename RandomIt void radix_sort(RandomIt first, RandomIt last) { if (first last) return; auto max_val *std::max_element(first, last); using ValueType typename std::iterator_traitsRandomIt::value_type; // 对每一位进行计数排序 for (ValueType exp 1; max_val / exp 0; exp * 10) { // 以10为基 counting_sort_on_digit(first, last, exp); } } // counting_sort_on_digit 需要根据特定位上的数字进行计数排序4. 性能对比分析与优化实践实现完所有算法后最重要的环节就是对比分析。我设计了一系列测试来揭示它们的真实表现。4.1 测试环境与方法论硬件/软件在一致的Release构建O2优化环境下测试。数据规模从1000到1,000,000个随机整数。数据类型除了int也测试double和自定义结构体包含多个字段自定义比较运算符。测试用例完全随机数组。已排序数组测试最佳情况。逆序数组测试最坏情况。包含大量重复元素的数组。几乎有序的数组只有少数元素位置不对。4.2 实测结果与深度洞察以下是我在某个测试中的简化结果摘要单位毫秒数据规模 100,000算法随机数据已排序数据逆序数据稳定性std::sort (IntroSort)15318否快速排序 (三数取中)181200 (最坏)1200 (最坏)否归并排序322830是堆排序454847否希尔排序22535否插入排序10500221000是计数排序8(范围小)--是关键发现与解读std::sort的强大它通常是性能最优且最稳健的选择。因为它并非单一算法而是内省排序——快速排序、堆排序和插入排序的混合体。当快速排序递归深度过大时切换到堆排序避免最坏O(n²)当分区规模很小时切换到插入排序。这是我们手动实现快速排序时应该学习的优化策略。快速排序的“阿喀琉斯之踵”虽然平均性能极佳但对已排序或逆序数据朴素实现如选第一个元素为主元会退化为O(n²)。这就是为什么“三数取中”或随机化主元至关重要。即便如此在某些极端重复数据下它仍可能表现不佳。归并排序的稳定性代价归并排序性能稳定在O(n log n)且是稳定的。但它的空间复杂度O(n)和相对较大的常数因子使其在内存敏感或对随机数据排序时通常慢于优化后的快速排序。插入排序的“特化”优势在数据量小20或几乎有序时插入排序可能是最快的因为它几乎没有开销且能提前终止。这就是为什么很多高级排序算法如std::sort在底层会切换到插入排序。非比较排序的“降维打击”当数据满足条件整数、范围小时计数排序和基数排序的性能是碾压级的达到O(n)。但这强烈依赖于数据特征不具备通用性。4.3 针对性优化技巧基于以上分析我们可以对自己的实现进行优化快速排序优化组合拳三数取中法选主元基本必备。小数组切换插入排序当递归到子数组长度小于阈值如16时直接调用插入排序。尾递归优化对较小的那个分区进行递归对较大的分区进行循环处理可以减少递归深度。处理重复元素使用三路快排将数组分为,,主元的三部分能高效处理大量重复元素。归并排序优化避免频繁内存分配在排序开始前一次性分配一个与原数组等大的临时空间在整个递归过程中重复使用。判断是否已有序在合并前如果前一个序列的最大值小于等于后一个序列的最小值则无需合并。通用优化使用移动语义在交换或插入元素时使用std::move特别是对于非平凡类型。使用迭代器而非索引更符合C习惯且能天然支持更多容器。编写noexcept和constexpr如果算法实现允许添加这些说明符可以帮助编译器进行更多优化。5. 常见问题、调试技巧与扩展思考在实际编码和测试过程中你一定会遇到各种问题。这里我分享一些踩过的坑和解决思路。5.1 典型问题排查清单问题现象可能原因排查思路排序结果不正确1. 比较逻辑错误与混用。2. 边界条件错误first last未处理。3. 递归终止条件错误。1. 使用极小的数据集3-5个元素单步调试。2. 打印每一轮或每次递归后的数组状态。3. 重点检查循环的起始、终止索引和递归的边界。程序崩溃段错误1. 迭代器失效或越界访问。2. 递归深度过大导致栈溢出快速排序最坏情况。1. 使用assert或条件判断确保迭代器有效、索引在范围内。2. 对于快速排序检查主元选择策略确保不会总是选到最值。3. 使用迭代器时确保last是“尾后”迭代器访问时用last-1。对自定义类型排序失败1. 类型没有定义运算符或比较函数。2. 排序算法不稳定破坏了相等元素的顺序。1. 为自定义类型重载运算符或提供自定义的比较器函数对象。2. 如果需要稳定排序选择归并、插入等稳定算法或检查不稳定算法中相等元素的交换逻辑。性能远低于预期1. 在Debug模式下测试。2. 算法实现存在低效操作如不必要的拷贝。3. 触发了算法的最坏时间复杂度。1. 确保在Release模式且开启优化如-O2下测试性能。2. 使用性能分析工具如perf,VTune定位热点。3. 检查数据是否触发了最坏情况如快速排序对已排序数据。5.2 调试与性能分析实战使用std::is_sorted验证在测试代码中排序后立即用std::is_sorted(first, last)验证结果这是最快速的正确性检查。可视化调试对于理解算法流程没有比可视化更直观的了。你可以写一个简单的函数在排序过程中每一步后打印数组状态对于小数组。或者使用一些图形库如SFML动态绘制排序过程这不仅能调试还能做成炫酷的演示。使用chrono精准计时auto start std::chrono::high_resolution_clock::now(); your_sort_function(vec.begin(), vec.end()); auto end std::chrono::high_resolution_clock::now(); auto duration std::chrono::duration_caststd::chrono::milliseconds(end - start); std::cout Time elapsed: duration.count() ms std::endl;记得多次运行取平均值并确保测试数据是独立的每次排序前重新生成或复制数据。5.3 项目扩展与深入学习方向完成基础实现后你可以尝试以下扩展让这个项目成为你简历上的亮点实现通用比较器让所有排序函数接受一个额外的Compare comp参数像STL一样支持自定义排序规则降序、按对象某个字段排序等。这需要将代码中所有的比较替换为comp(a, b)。支持更多容器和迭代器尝试让你的算法支持双向迭代器如std::list的迭代器虽然像快速排序这样的算法需要随机访问但这是一个很好的模板元编程练习。并行化排序利用多线程加速排序。归并排序和快速排序是“分治”算法的天然并行候选者。你可以使用std::async或std::thread来并行处理子任务。注意线程创建开销和负载均衡。实现TimSort这是Python和Java中使用的高级混合排序算法结合了归并排序和插入排序的优点对现实世界中部分有序的数据特别高效。实现它是对你算法和工程能力的极大挑战。与STL算法对比深入阅读你所用标准库中std::sort的源码如GCC的libstdc或Clang的libc分析其内省排序的具体实现和优化技巧并与你自己的实现进行对比。亲手实现这十大排序算法就像一次系统的算法思维训练。它强迫你理解每一个“为什么”而不仅仅是“怎么做”。当你再看到std::sort时你看到的将不再是一个黑盒而是一个由快速排序、堆排序、插入排序精心组合而成的艺术品。这份深入的理解是区分普通代码搬运工和真正工程师的关键。

相关新闻

如何在15分钟内免费搭建跨平台键鼠共享系统:Barrier终极指南

如何在15分钟内免费搭建跨平台键鼠共享系统:Barrier终极指南

如何在15分钟内免费搭建跨平台键鼠共享系统:Barrier终极指南 【免费下载链接】barrier Open-source KVM software 项目地址: https://gitcode.com/gh_mirrors/ba/barrier 你是否厌倦了在多个电脑间来回切换键盘和鼠标?是否梦想着用一个键盘鼠标同…

2026/8/7 14:23:48 阅读更多 →
Mobile-Agent完全指南:5分钟掌握跨平台GUI自动化核心技术

Mobile-Agent完全指南:5分钟掌握跨平台GUI自动化核心技术

Mobile-Agent完全指南:5分钟掌握跨平台GUI自动化核心技术 【免费下载链接】MobileAgent Mobile-Agent: The Powerful GUI Agent Family 项目地址: https://gitcode.com/GitHub_Trending/mo/MobileAgent Mobile-Agent是由阿里巴巴通义实验室开发的GUI智能体家…

2026/8/7 14:22:48 阅读更多 →
终极《全面战争》模组制作工具:Rusted PackFile Manager (RPFM) 完全指南

终极《全面战争》模组制作工具:Rusted PackFile Manager (RPFM) 完全指南

终极《全面战争》模组制作工具:Rusted PackFile Manager (RPFM) 完全指南 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目…

2026/8/7 14:22:48 阅读更多 →

最新新闻

2026高中生英语词汇学习APP测评:天学网等4款产品实测对比

2026高中生英语词汇学习APP测评:天学网等4款产品实测对比

【摘要】本文基于第三方教育科技研究机构2026年Q1实测数据,从课标适配度、记忆效率与合规性三个维度,深度测评天学网学生端、百词斩、网易有道词典、墨墨背单词4款产品,并针对不同学习场景给出选购建议,帮助高中生和家长高效选择适…

2026/8/8 0:49:50 阅读更多 →
国产算力接管银行:5国产LLM适配屠夫榜

国产算力接管银行:5国产LLM适配屠夫榜

国产算力接管银行:5国产LLM适配屠夫榜 适用读者:想在银行风控 Agent 里调 GLM / Qwen / DeepSeek / 文心一言 / MiMo 这些国产大模型 API 的开发者 阅读时长:约 12 分钟 测试时间:2026 年 7 月(基于 炻光 AI 接入管理平台 公开文档) 一、为什么 2026 年 Q3 银行风控突然都在聊国…

2026/8/8 0:49:50 阅读更多 →
国密门禁供应商怎么选?2026年最新3个筛选标准

国密门禁供应商怎么选?2026年最新3个筛选标准

最近好多同行、甲方爸爸找我问,2026年选国密门禁供应商要注意啥?我做这行5年,踩过的坑能装一箩筐,整理了3个可落地的筛选标准,覆盖合规、改造成本、运维全周期,帮你避开90%的坑。我们团队在实践中发现&…

2026/8/8 0:49:50 阅读更多 →
Python Pygame中国象棋开发:从规则实现到AI对战完整指南

Python Pygame中国象棋开发:从规则实现到AI对战完整指南

1. 项目概述与核心价值 最近在整理自己的项目库,翻到了几年前用Python和Pygame写的一个中国象棋游戏。这个项目当时花了不少心思,不仅实现了完整的双人对战,还集成了一个基于简单规则的AI对手。今天把它重新梳理了一遍,代码也做了…

2026/8/8 0:49:49 阅读更多 →
UAssetGUI:专业级虚幻引擎资产离线编辑解决方案

UAssetGUI:专业级虚幻引擎资产离线编辑解决方案

UAssetGUI:专业级虚幻引擎资产离线编辑解决方案 【免费下载链接】UAssetGUI A tool designed for low-level examination and modification of Unreal Engine game assets by hand. 项目地址: https://gitcode.com/gh_mirrors/ua/UAssetGUI 虚幻引擎资产编辑…

2026/8/8 0:48:49 阅读更多 →
Headroom 三大压缩器详解:从原理到代码实战

Headroom 三大压缩器详解:从原理到代码实战

1. 引言Headroom 是音频处理领域一个非常实用的动态范围压缩工具库,它把复杂的压缩器原理封装成简洁易用的 API,让开发者可以快速在项目中集成专业级的音频动态处理能力。本文将从原理到实战,详细讲解 Headroom 的三大压缩器:峰值…

2026/8/8 0:47:48 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及,无数企业下场搭建智能体系统,可落地阶段难题接踵而至:上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节,空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代,二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起:为什么我们需要一个隐私保护通用组件?最近在维护一个基于uniapp开发的微信小程序矩阵时,我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格,几乎每一个新版本发布,或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/7 23:54:54 阅读更多 →
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/7 17:02:36 阅读更多 →