排序算法入门:从冒泡、选择到内置函数,掌握三种排序方法实现与选型
1. 项目概述排序算法的入门实践排序可以说是编程世界里最基础、最经典也最常被拿来练手的问题之一。无论是面试中的算法题还是日常数据处理排序都扮演着核心角色。今天要聊的这个题目——“输入十个数按从大到小的顺序依次输出”看似简单却是一个绝佳的算法入门沙盒。它没有复杂的业务背景没有花哨的界面就是纯粹的、对十个数字进行排序的逻辑较量。对于初学者而言这是一个理解算法思想、比较不同方法优劣的绝佳起点对于有经验的开发者重温这些基础方法也能在优化更复杂系统时获得新的启发。这个问题的核心需求非常明确接收十个数字作为输入经过处理后按照从大到小的顺序输出这十个数字。它考察的是对数据的组织能力和对排序逻辑的掌控力。我们将探讨三种典型的实现方法冒泡排序、选择排序以及利用内置函数如Python的sorted的“取巧”方法。每种方法背后都蕴含着不同的编程思想和时间复杂度考量。通过这个小小的题目我们不仅能学会如何让数字“听话”地排队更能深入理解算法效率的差异为日后处理海量数据打下坚实的基础。2. 三种排序方法的核心思路与选型考量面对“排序十个数字”这个任务为什么我们要选择三种不同的方法这不仅仅是炫技更是为了展示解决问题思路的多样性。每种方法都代表了算法设计中的一个经典范式其背后的权衡直接关系到代码的效率和可读性。2.1 方法一冒泡排序——直观的“邻里交换”冒泡排序可能是大多数人接触到的第一个排序算法。它的思想非常生活化想象一列无序站队的人我们要按身高从高到矮排列。我们从队首开始让相邻的两个人比较身高如果左边的人比右边矮在我们从大到小的需求里就是数值小就让他们交换位置。这样一轮比较下来最“轻”最小的那个数字就会像气泡一样“浮”到序列的末尾右侧。然后我们对剩下的前九个数字重复这个过程第二小的数字会浮到倒数第二的位置……如此反复直到所有数字有序。它的优点是极其直观代码易于理解和实现非常适合教学和快速验证思路。对于仅仅十个数字的场景其性能完全可接受。但缺点也很明显效率较低。它需要进行多轮遍历即使数据已经部分有序它仍然会“傻傻地”完成所有比较时间复杂度在最坏和平均情况下都是O(n²)。当n10时最坏情况下需要大约45次比较。所以冒泡排序适用于数据量小或对代码简洁性要求高于效率的场景。2.2 方法二选择排序——精准的“擂台选拔”选择排序采用了另一种策略我们不再忙于让相邻元素交换而是更有目的性地寻找目标。在第一轮我们遍历整个数组找到最大的那个数字然后把它和第一个位置索引0的数字交换。这样第一个位置就放好了全局最大值。接下来我们在剩下的九个数字中寻找最大值将其与第二个位置交换……以此类推。这种方法同样是O(n²)的时间复杂度但它有一个特点交换次数少。冒泡排序每发现一个逆序对就可能交换一次而选择排序每轮只进行一次交换将找到的最大值放到目标位置。在交换操作成本较高例如交换的不是数字而是大型对象的场景下选择排序可能略有优势。它的思路也清晰明了——“选择”当前未排序部分的最大值体现了贪心算法的思想。2.3 方法三使用内置函数——高效的“拿来主义”以Python为例我们可以直接使用内置的sorted()函数或列表的.sort()方法。一行代码就能解决问题sorted(numbers, reverseTrue)。这看起来像是“作弊”但其实是现代编程中非常重要的一种思维善用语言特性和标准库。内置的排序函数如Python中的Timsort是高度优化的混合排序算法平均和最坏情况时间复杂度为O(n log n)效率远高于我们自己写的O(n²)算法。对于任何严肃的数据处理任务这都应该是首选。这种方法的核心价值在于将精力从重复造轮子转移到解决更复杂的业务逻辑上。理解其存在和适用性是程序员专业性的体现。注意在学习和面试场景中通常要求手写排序算法以考察基本功因此掌握前两种方法是必要的。但在实际项目开发中除非有极特殊的定制化需求如对特定硬件优化或嵌入式环境限制否则应优先使用内置或经过充分验证的库函数。3. 核心细节解析与实操要点理解了思路我们来看看实现时的关键细节。这些细节决定了代码是否正确、健壮和优雅。3.1 数据输入环节的鲁棒性处理题目要求“输入十个数”但用户输入是不可控的。我们假设通过标准输入如input()获取。这里的关键是类型转换和错误处理。用户可能输入非数字字符也可能输入的数字个数不对。一个健壮的程序应该能处理这些情况。# 基础输入示例假设每行输入一个数或一行内用空格分隔 input_str input(“请输入10个整数用空格分隔: “) str_list input_str.split() if len(str_list) ! 10: print(“错误请输入恰好10个数字。”) # 这里可以设计循环让用户重新输入或直接退出 exit(1) numbers [] for s in str_list: try: numbers.append(int(s)) # 根据需求也可以是float(s) except ValueError: print(f“错误{s} 不是有效的数字。”) exit(1)对于更简单的演示我们可以直接在代码中初始化一个包含10个数的列表但上述交互式输入更能体现程序的完整性。3.2 排序算法中的边界条件与索引控制无论是冒泡还是选择排序循环的边界都是极易出错的地方。冒泡排序的轮数对于n个元素需要n-1轮循环for i in range(n-1)。因为经过n-1轮最后一个元素自然就位。每一轮内部比较的终点索引是n-1-i因为每一轮都会将当前未排序部分的最小值“冒泡”到末尾所以末尾的i个元素已经有序无需再比较。选择排序的边界同样需要n-1轮循环for i in range(n-1)。因为进行到第n-1轮时只剩下最后一个元素它自然就在正确的位置上。内层循环从i1开始寻找[i1, n)区间内的最大值索引。实操心得在纸上画一个包含4-5个元素的小数组手动模拟算法的每一步是理解边界条件最有效的方法。用print语句在每轮循环后输出数组当前状态也是调试的好帮手。3.3 从大到小与从小到大的逻辑切换题目要求“从大到小”而我们通常学习的算法默认为“从小到大”。这个切换很简单但必须清晰冒泡排序将比较条件从if arr[j] arr[j1]从小到大改为if arr[j] arr[j1]从大到小。这样较小的数字就会向后移动。选择排序将寻找“最小值的索引”改为寻找“最大值的索引”。即内层循环中比较条件从if arr[j] arr[min_idx]改为if arr[j] arr[max_idx]。内置函数使用reverseTrue参数。一个常见的坑不要试图通过反转一个已经从小到大排好的数组来得到从大到小的结果虽然结果对但效率低。应该在排序逻辑中直接控制方向。4. 三种方法的完整代码实现与解析下面我们分别用Python实现这三种方法并附上详细的注释和过程分析。假设我们已经成功获取并转换了一个包含10个整数的列表nums。4.1 方法一实现冒泡排序 (Bubble Sort)def bubble_sort_desc(nums): 使用冒泡排序将列表按从大到小排序。 Args: nums: List[int]待排序的列表。 Returns: List[int]: 从大到小排序后的新列表。为避免修改原列表这里操作副本。 n len(nums) arr nums[:] # 创建副本不改变原数据 for i in range(n - 1): # 进行n-1轮遍历 # 优化设置一个标志位如果本轮没有发生交换说明已有序可提前结束 swapped False for j in range(0, n - 1 - i): # 每轮比较的范围逐渐缩小 if arr[j] arr[j 1]: # 如果前面的元素小于后面的则交换实现从大到小 arr[j], arr[j 1] arr[j 1], arr[j] # Python优雅的交换语法 swapped True if not swapped: # 本轮无交换提前结束 break # 调试用打印每一轮结束后的数组状态 # print(f“第{i1}轮后: {arr}“) return arr # 示例调用 sample_nums [64, 34, 25, 12, 22, 11, 90, 88, 76, 50] print(“原始数组:”, sample_nums) sorted_nums bubble_sort_desc(sample_nums) print(“冒泡排序(从大到小)结果:”, sorted_nums) print(“原数组未被修改:”, sample_nums) # 应输出原始数组过程解析以[64, 34, 25, 12]为例简化。第一轮(i0)比较64和34不交换比较34和25不交换比较25和12不交换。数组未变swapped为False直接结束。实际上这个数组已经是从大到小有序。这展示了加入swapped标志位优化的价值。对于一个完全逆序的数组如[12, 25, 34, 64]则需要完整执行n-1轮。4.2 方法二实现选择排序 (Selection Sort)def selection_sort_desc(nums): 使用选择排序将列表按从大到小排序。 Args: nums: List[int]待排序的列表。 Returns: List[int]: 从大到小排序后的新列表。 n len(nums) arr nums[:] # 创建副本 for i in range(n - 1): # 同样只需要n-1轮 # 假设当前未排序部分的第一个元素索引i就是最大值 max_idx i # 在i1到末尾的区间内寻找真正的最大值索引 for j in range(i 1, n): if arr[j] arr[max_idx]: # 找到更大的数 max_idx j # 将找到的最大值与当前位置i交换 if max_idx ! i: # 如果最大值不在当前位置才需要交换 arr[i], arr[max_idx] arr[max_idx], arr[i] # 调试用打印每一轮结束后的数组状态 # print(f“第{i1}轮后 (将索引{max_idx}的值放到位置{i}): {arr}“) return arr # 示例调用 print(“\n--- 选择排序演示 ---“) print(“原始数组:”, sample_nums) sorted_nums_select selection_sort_desc(sample_nums) print(“选择排序(从大到小)结果:”, sorted_nums_select)过程解析同样以[12, 25, 34, 64]为例。第一轮(i0)在[12,25,34,64]中寻找最大值找到64索引3将其与索引0的12交换得到[64,25,34,12]。第二轮(i1)在[25,34,12]中寻找最大值找到34索引2将其与索引1的25交换得到[64,34,25,12]。此时已有序后续轮次max_idx等于i不再交换。4.3 方法三实现使用内置函数 (Built-in)def builtin_sort_desc(nums): 使用内置sorted函数将列表按从大到小排序。 Args: nums: List[int]待排序的列表。 Returns: List[int]: 从大到小排序后的新列表。 # 方法1: 使用sorted函数返回新列表原列表不变 return sorted(nums, reverseTrue) # 方法2: 使用列表的sort方法在原列表上修改 # nums.sort(reverseTrue) # return nums # 注意这会改变传入的原始列表 # 示例调用 print(“\n--- 内置函数排序演示 ---“) print(“原始数组:”, sample_nums) sorted_nums_builtin builtin_sort_desc(sample_nums) print(“内置排序(从大到小)结果:”, sorted_nums_builtin) print(“原数组未被修改:”, sample_nums) # 应输出原始数组关键点sorted()返回一个新列表而list.sort()在原列表上修改。根据是否需要保留原数据选择合适的方法。reverseTrue参数直接指定降序。5. 算法对比与场景选择为了更直观地比较我们将三种方法的关键特性总结如下特性维度冒泡排序 (优化版)选择排序内置排序 (如Python sorted)时间复杂度(平均/最坏)O(n²)O(n²)O(n log n)时间复杂度(最好)O(n) (已有序时)O(n²)O(n log n)空间复杂度O(1) (原地排序)O(1) (原地排序)O(n) (sorted返回新列表)是否稳定是 (相同值不交换)否 (交换可能改变相同值顺序)是 (Python的Timsort是稳定的)交换次数多 (可能多次交换相邻元素)少 (每轮至多一次交换)依赖内部实现代码复杂度简单简单极其简单适用场景教学、数据量极小、或已基本有序教学、交换成本高的场景几乎所有实际生产场景场景选择建议学习与理解算法思想亲手实现冒泡和选择排序理解循环、比较、交换这些基本操作。处理极小规模数据 (n50)当数据量极小时O(n²)和O(n log n)的绝对时间差异微乎其微甚至由于常数因子简单算法可能更快。但这种情况很少见。嵌入式或极度受限环境在某些内存极小、不支持标准库的嵌入式系统中可能需要手写简单的排序算法。实际软件开发毫不犹豫地使用内置排序函数。它的高效、稳定和健壮性已经过千锤百炼。6. 常见问题与排查技巧实录在实际编写和调试排序代码时新手常会遇到一些典型问题。6.1 问题一排序结果不正确顺序混乱可能原因1比较逻辑符号弄反。这是最常见的问题。想要从大到小却写成了if arr[j] arr[j1]这是从小到大冒泡的条件。排查检查所有比较语句if条件。确保降序排序使用小于号()来触发交换或选择更大值。可能原因2循环边界错误。例如在冒泡排序中内层循环写成了for j in range(0, n-1)忽略了每轮已排序元素导致不必要的比较虽然结果可能对但效率低。更严重的是索引越界如arr[j1]当j取最大值时溢出。排查用一个小数组如4个元素在纸上或通过打印每轮中间状态一步步跟踪索引值。确保内层循环的终点是n-1-i冒泡或从i1开始选择。可能原因3在原列表上操作导致后续比较数据被污染。这在选择排序中尤其要注意如果你先取出max_value arr[max_idx]然后执行arr[i], arr[max_idx] max_value, arr[i]逻辑上没错。但更安全的做法是直接使用Python的元组交换。排查使用arr nums[:]创建副本进行操作避免意外修改原数据影响其他逻辑。6.2 问题二程序运行时报“索引超出范围”错误几乎肯定是循环边界问题。例如# 错误示例 for i in range(n): # i会取到n-1 for j in range(0, n-1-i): if arr[j] arr[j1]: # 当i0时j最大为n-2, j1为n-1安全。 # 但当in-1时内层循环range(0, -1)不执行不会出错但多了一轮无意义循环。 # 更危险的是如果内层循环终点写错...排查仔细计算最大索引。记住列表索引从0到n-1。range(a, b)生成的区间是[a, b)。在涉及arr[j1]时必须保证j的最大值不超过n-2。6.3 问题三输入处理时程序崩溃可能原因输入格式不符合预期或包含非数字字符。排查加入健壮的错误处理如上一节所述。使用try...except捕获ValueError并检查输入数字的个数。6.4 调试技巧实录打印中间状态在每一轮外层循环结束后打印当前数组。这是最直观的调试方法能让你看清数据是如何一步步移动的。for i in range(n-1): # ... 排序逻辑 ... print(f“第{i1}轮后: {arr}“) # 观察变化使用最小用例不要一开始就用10个随机数测试。使用极端用例已经是从大到小有序的[5,4,3,2,1]完全从小到大逆序的[1,2,3,4,5]所有元素都相同的[7,7,7,7,7]只有两个元素的[2,1]这些用例能快速暴露边界条件错误。可视化工具辅助理解对于初学者在线算法可视化网站如VisuAlgo可以动态展示排序过程帮助建立直观感受。排序是算法的基石理解这几种基础方法就像学会了加减乘除未来面对快速排序、归并排序等更高效的算法以及它们在数据库索引、调度系统等复杂场景中的应用你才能融会贯通。从这十个数字开始你的算法之旅已经踏出了坚实的一步。

相关新闻

【制造业AI落地生死线】:为什么83%的AI项目卡在数据治理?一线工程师血泪复盘

【制造业AI落地生死线】:为什么83%的AI项目卡在数据治理?一线工程师血泪复盘

更多请点击: https://codechina.net 第一章:AI 改变制造业 人工智能正以前所未有的深度与广度重塑制造业的底层逻辑。从预测性维护到自适应产线调度,AI 不再是实验室中的概念验证,而是嵌入设备控制层、MES 系统与供应链协同平台的…

2026/8/3 21:26:20 阅读更多 →
如何在3秒内快速查看任何3D模型?F3D终极指南

如何在3秒内快速查看任何3D模型?F3D终极指南

如何在3秒内快速查看任何3D模型?F3D终极指南 【免费下载链接】f3d Fast and minimalist 3D viewer. 项目地址: https://gitcode.com/GitHub_Trending/f3/f3d 还在为打开大型3D文件而烦恼吗?💻 专业软件启动慢、内存占用高,…

2026/8/3 21:25:19 阅读更多 →
如何有效利用gh_mirrors/deep/deep-learning-resources:給初學者的5個學習技巧與資源導航

如何有效利用gh_mirrors/deep/deep-learning-resources:給初學者的5個學習技巧與資源導航

如何有效利用gh_mirrors/deep/deep-learning-resources:給初學者的5個學習技巧與資源導航 【免费下载链接】deep-learning-resources 由淺入深的深度學習資源 Collection of deep learning materials for everyone 项目地址: https://gitcode.com/gh_mirrors/deep…

2026/8/3 21:25:19 阅读更多 →

最新新闻

C++类型系统深度解析与高性能编程实践

C++类型系统深度解析与高性能编程实践

1. 为什么C程序员必须吃透类型系统在C社区里流传着这样一句话&#xff1a;"真正理解C的类型系统&#xff0c;才算摸到了这门语言的门槛。"我至今记得第一次用std::vector<std::unordered_map<std::string, std::variant<int, float>>>这样的嵌套类…

2026/8/4 4:03:32 阅读更多 →
安卓玩机工具全解析:从基础到进阶

安卓玩机工具全解析:从基础到进阶

1. 安卓玩机工具全景概览安卓系统的开放性为技术爱好者提供了广阔的探索空间。不同于iOS的封闭生态&#xff0c;安卓允许用户通过各类工具对设备进行深度定制和功能扩展。玩机文化自安卓诞生之初便已形成&#xff0c;从早期的简单root操作发展到如今完整的工具链生态。当前主流…

2026/8/4 4:03:32 阅读更多 →
UE5 C++多人联机项目避坑指南:从项目创建到打包部署全流程解析

UE5 C++多人联机项目避坑指南:从项目创建到打包部署全流程解析

1. 项目概述&#xff1a;为什么联机开发总在第一步就“翻车”&#xff1f;干了这么多年UE开发&#xff0c;我发现一个挺有意思的现象&#xff1a;很多团队在启动一个UE5 C多人联机项目时&#xff0c;往往雄心勃勃&#xff0c;直奔核心玩法逻辑而去&#xff0c;结果却在最基础的…

2026/8/4 4:03:32 阅读更多 →
移动端App页面区域设计核心原则与实践指南

移动端App页面区域设计核心原则与实践指南

1. 移动端页面区域设计概述在移动互联网时代&#xff0c;App页面区域设计直接影响用户体验和产品留存率。一个优秀的页面区域划分需要考虑手指触控热区、视觉焦点分布以及信息层级关系。根据Fitts定律&#xff0c;目标区域大小与操作效率成正比&#xff0c;这意味着我们需要为关…

2026/8/4 4:03:32 阅读更多 →
【第二章11】保留消息过期时间

【第二章11】保留消息过期时间

一、MQTT 保留消息过期时间简介保留消息的过期时间是MQTT 5.0协议中用于控制服务端保留消息生命周期的核心特性&#xff0c;它可以避免过时的历史数据长期占用服务端存储资源&#xff0c;同时保障新订阅者获取到的始终是有效的最新数据。 &#x1f50d; 核心机制说明 ‌基础定义…

2026/8/4 4:03:32 阅读更多 →
前端时间同步方案:从Date对象到高精度时间校准实战

前端时间同步方案:从Date对象到高精度时间校准实战

1. 项目概述&#xff1a;一个看似简单却暗藏玄机的日常需求在Web前端开发中&#xff0c;获取时间是一个高频到几乎被忽略的基础操作。无论是展示文章发布时间、倒计时活动&#xff0c;还是记录用户操作日志&#xff0c;我们都会不假思索地写下new Date()。这个需求简单到似乎不…

2026/8/4 4:02:32 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标&#xff1a;掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码&#xff1a;多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话&#xff0c;第一次听说美国这个老牌折扣网站的跨境卖家&#xff0c;十个有八个会问同一个问题&#xff1a;这个平台到底是干嘛的&#xff1f;我见过一个做家居出口的朋友&#xff0c;他在亚马逊上月销二十万美金&#xff0c;却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者&#xff1a;邓兵、刘建国通讯单位&#xff1a;清华大学DOI&#xff1a;https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素&#xff08;REEs&#xff09;是清洁能源技术与电子器件不可或缺的核心原料&#xff0c;然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

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

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

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

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

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

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

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

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

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

2026/8/3 4:36:35 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/8/3 8:27:36 阅读更多 →