ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

freeCodeCamp 算法课程实战:用挑战驱动的方式实现冒泡排序(Implement Bubble Sort)

freeCodeCamp 算法课程实战:用挑战驱动的方式实现冒泡排序(Implement Bubble Sort) freeCodeCamp 算法课程实战用挑战驱动的方式实现冒泡排序Implement Bubble Sort【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp本篇指南以 freeCodeCamp 课程中「Implement Bubble Sort」挑战题的完整题目文件为蓝本带你完整走读这道题的题面描述、测试断言、初始代码骨架与参考解答理解冒泡排序「相邻比较 交换 提前终止」的核心机制及其平均/最坏 O(n²) 的时间复杂度来源并结合仓库中的课程结构与解析管线弄清这道题在 freeCodeCamp 课程体系中的定位与运行方式。读完你可以独立实现一个带提前退出优化的冒泡排序、看懂并规避「禁用内置 sort」这类反作弊测试并了解 freeCodeCamp 挑战题文件的组织规范。题目背景algorithms 块中的排序算法系列该挑战题位于 freeCodeCamp 英文课程algorithms代码块中从 题目文件 的 frontmatter 可以看到其元数据--- id: 8d5123c8c441eddfaeb5bdef title: Implement Bubble Sort challengeType: 1 forumTopicId: 301612 dashedName: implement-bubble-sort ---其中challengeType: 1对应 packages/shared/src/config/challenge-types.ts 中的js类型const js 1该类型映射到viewTypes的classic经典答题视图提交方式为submitTypes中的tests——即由测试断言判定通过与否。从 curriculum/structure/blocks/algorithms.json 的challengeOrder可以看出这道题是整个排序算法系列的第一道顺序挑战题1Implement Bubble Sort本文主角2Implement Selection Sort3Implement Insertion Sort4Implement Quick Sort5Implement Merge Sort6Implement Binary Search该块还包含 Find the Symmetric Difference、Inventory Update、No Repeats Please、Pairwise 等前置数组题。整个algorithms块隶属于 coding-interview-prep.json 超级块与data-structures、take-home-projects并列因此这道题的定位是面试准备课程中「手写排序算法」的开篇。题面要求与冒泡排序的原理题目原文的 description 部分先给出系列总述这是关于排序算法的系列题的第一道。给定一个未排序的数组我们希望返回一个排序后的数组。我们会看到几种不同的方法并学习不同方案之间的权衡。虽然大多数现代语言都有内置的排序方法但理解一些常见的经典做法、并学会如何实现它们依然非常重要。接着描述冒泡排序的机制从未排序数组的开头出发把未归位的值一路「冒泡」bubble up到数组末尾具体手段是比较相邻元素若顺序不对就交换compare adjacent items and swap them if they are out of order反复遍历整个数组直到某一轮遍历不再发生任何交换此时数组已排序。题目同时给出了复杂度结论该方法需要多轮遍历数组平均情况和最坏情况的时间复杂度都是平方级quadratic即 O(n²)。虽然简单但在大多数实际场景中并不实用impractical——这正是它与后续 Quick Sort、Merge Sort 题目的核心 tradeoff。指令Instructions编写函数bubbleSort接受一个整数数组作为输入返回一个按从小到大least to greatest排序的整数数组。初始代码骨架seed# --seed--下的## --seed-contents--定义了答题编辑器里展示的初始代码function bubbleSort(array) { // Only change code below this line return array; // Only change code above this line }骨架只返回原数组中间的注释行标明了允许改动的区域。freeCodeCamp 的解析管线会从题目文件提取这段种子代码tools/challenge-parser/parser/plugins/add-seed.js 会定位# --seed--与## --seed-contents--两个小节把代码块内容写入挑战文件的seed字段供编辑器渲染frontmatter 中的id、title等字段则受 curriculum/schema/challenge-schema.js 的 Joi schema 校验。四道测试断言逐一解析# --hints--小节定义了四组断言它们既是题目通过标准也是理解考点的最佳材料。1.bubbleSort必须是一个函数assert.isFunction(bubbleSort);最基础的类型检查防止空函数或返回 undefined 的写法。2. 返回结果必须是升序排列的数组function isSorted(a){ for(let i 0; i a.length - 1; i) if(a[i] a[i 1]) return false; return true; } assert.isTrue( isSorted( bubbleSort([ 1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92 ]) ) );isSorted是一个线性扫描工具函数只要存在某个a[i] a[i 1]即判定未排序。测试输入的 17 个元素中含重复值123 出现两次、43 出现两次、2 和 1 各出现两次因此实现必须使用严格大于触发交换相等元素无需交换这一点与参考解答一致。3. 排序不得增删元素只改变顺序assert.sameMembers( bubbleSort([ 1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92 ]), [1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92] );Chai 的sameMembers做多重集相等比较忽略顺序、保留重复项计数。这堵死了「先全部推入新数组再靠内置排序/过滤凑答案」的偷懒路径——返回数组必须与原数组拥有完全相同的多重集合。4. 禁止调用内置Array.prototype.sortfunction isBuiltInSortUsed(){ let sortUsed false; const temp Array.prototype.sort; Array.prototype.sort () sortUsed true; try { bubbleSort([0, 1]); } finally { Array.prototype.sort temp; } return sortUsed; } assert.isFalse(isBuiltInSortUsed());这是一段典型的猴子补丁monkey patch反作弊技巧临时替换Array.prototype.sort为一个只记录调用的桩函数在try/finally中调用被测函数保证 finally 中恢复原方法最后检查桩是否被触发。对实现者的启示是不要依赖sort也不要用sort的间接变体老老实实用比较与交换自己完成排序。参考解答带提前退出标志的经典实现# --solutions--小节给出的官方解答如下function bubbleSort(array) { for (let i 0; i array.length; i) { let swapped false; for (let j 1; j array.length; j) { if (array[j - 1] array[j]) { let temp array[j-1]; array[j-1] array[j]; array[j] temp; swapped true; } } if (swapped false) { break; } } return array; }逐层拆解其结构外层循环for (let i 0; i array.length; i)最多进行array.length轮遍历每轮理论上把「最大未归位元素」向尾部推进一位冒泡过程的宏观效果。内层循环for (let j 1; j array.length; j)从下标 1 开始逐对比较array[j - 1]与array[j]一旦发现逆序就用临时变量temp完成三行交换。swapped提前终止优化每轮开始时置false发生任何交换即置true一轮结束若swapped false说明整轮没有逆序对数组必然已有序直接break。这正是题面所说「until no swaps occur at which point the array is sorted」的代码化表达——它让最好情况输入已有序的复杂度从 O(n²) 降到 O(n)而平均/最坏仍为 O(n²)。原地排序in-place函数直接改写传入数组并返回同一引用空间复杂度 O(1)。这与断言 3 的sameMembers语义配合说明题目允许且默认原地修改。从源码结构看内层循环写成j array.length而非更紧凑的j array.length - 1 - i属于教学取舍前者每轮仍扫描全数组依赖外层break兜底后者每轮跳过尾部已归位的后缀交换次数更少。两者都正确前者更直观。复杂度与「为什么还要学它」题面已给出结论这里给出可对照参考的量化视角以长度 n 的数组计情形比较/交换规模时间复杂度最好已有序且实现带swapped提前退出n-1 次比较O(n)平均两轮嵌套、规模 ~ n²/2O(n²)最坏逆序比较 ~ n²/2交换 ~ n²/2O(n²)空间原地O(1)freeCodeCamp 之所以在coding-interview-prep超级块里从冒泡排序讲起是因为它是理解「比较排序」权衡的最小模型常数因子小、实现简单、稳定但 O(n²) 使其在真实工程中「impractical」——这正是题面强调的。紧随其后的 Implement Selection Sort 同为 O(n²) 但「任何情况下都是平方级」再往后 Implement Quick Sort 与 Implement Merge Sort 则进入 O(n log n) 分治阵营与冒泡排序形成明确的复杂度对照。小结题目要求写bubbleSort(array)返回升序排列的整数数组且不得使用Array.prototype.sort核心机制相邻比较、逆序交换直到「某一轮无交换」即停官方解答的关键点是swapped标志带来的提前退出优化最好情况 O(n)与原地 O(1) 空间四组断言分别覆盖「是函数」「结果有序」「元素多重集不变」「未用内置 sort」其中猴子补丁检测是学习面试手写算法题时值得复用的反作弊手法该题是 freeCodeCampcoding-interview-prep超级块下algorithms代码块排序系列的起点完整题面、测试与解答均可在 curriculum/challenges/english/blocks/algorithms/8d5123c8c441eddfaeb5bdef.md 中查看。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表