首页 > 其他分享 >揭秘合并排序:分治排序初学者指南

揭秘合并排序:分治排序初学者指南

时间:2024-09-26 21:04:36浏览次数:5  
标签:10 27 合并 初学者 数组 82 排序 揭秘

归并排序由约翰·冯·诺依曼于 1945 年提出,主要是为了提高大型数据集的排序效率。冯·诺依曼的算法旨在使用分而治之的方法提供一致且可预测的排序过程。这种策略允许归并排序有效地处理小型和大型数据集,保证在所有情况下都能实现稳定的排序,时间复杂度为 o(n log n)。合并排序采用分而治之方法,将数组分割成更小的子数组,对它们进行递归排序,然后将排序后的数组重新合并在一起。这种方法将问题分解为可管理的块,对每个块进行单独排序并有效地将它们组合起来。因此,通过划分排序工作量,该算法即使在大型数据集上也能表现良好。c++kquote>递归是一个函数调用自身来解决同一问题的较小版本的过程。它不断分解问题,直到问题足够简单可以直接解决,这称为基本情况。下面是 javascript 中归并排序的实现,展示了如何递归地拆分和合并数组:function mergesort(arr) { if (arr.length <p>为了更好地理解归并排序的工作原理,让我们使用数组来演示整个过程:[38, 27, 43, 3, 9, 82, 10]</p><p><strong>第 1 步:递归除法(mergesort 函数)</strong><br>该数组被递归地分割成更小的子数组,直到每个子数组只有一个元素。这是通过 mergesort 函数中的以下几行实现的:<br></p><pre class="brush:php;toolbar:false">function mergesort(arr) { if (arr.length <p>这会停止我们的递归。</p><p>以下是递归除法的展开方式:</p>登录后复制初始调用: mergesort([38, 27, 43, 3, 9, 82, 10])数组在中点分割:[38,27,43] 和 [3,9,82,10]上半场:合并排序([38,27,43])在中点分割:[38] 和 [27, 43]合并排序([27, 43])分为[27]和[43]子数组 [38]、[27] 和 [43] 现在是单独的元素,可以合并。下半场:合并排序([3, 9, 82, 10])在中点分割:[3, 9] 和 [82, 10]合并排序([3, 9])分为[3]和[9]合并排序([82, 10])分为[82]和[10]子数组 [3]、[9]、[82] 和 [10] 现在已准备好合并。第 2 步:合并已排序的子数组(合并函数)现在,我们开始使用 merge 函数将子数组按排序顺序合并在一起:function merge(left, right) { let result = []; while (left.length &amp;&amp; right.length) { if (left[0] <p>合并过程的工作原理如下:</p><p><strong>第一次合并(来自基本情况):</strong></p>登录后复制合并 [27] 和 [43] → 结果为 [27, 43]将 [38] 与 [27, 43] 合并 → 结果为 [27, 38, 43]此时,数组的左半部分已完全合并:[27, 38, 43]。第二次合并(来自基本情况):合并 [3] 和 [9] → 结果为 [3, 9]合并 [82] 和 [10] → 结果为 [10, 82]将 [3, 9] 与 [10, 82] 合并 → 结果为 [3, 9, 10, 82]现在,右半部分已完全合并:[3, 9, 10, 82]。第 3 步:最终合并最后,使用 merge 函数将两半 [27, 38, 43] 和 [3, 9, 10, 82] 合并:比较 27(左[0])和 3(右[0])。由于 3 比较 27 和 9。将结果加上 9。比较 27 和 10。结果加 10。比较 27 和 82。将结果加上 27。比较 38 和 82。结果加上 38。比较 43 和 82。将 43 添加到结果中。添加右侧数组中剩余的元素 82。完全合并和排序的数组是:[3, 9, 10, 27, 38, 43, 82].时间复杂度: 最佳、平均和最坏情况:o(n log n)让我们仔细看看:除法(o(log n)):每次将数组分成两半,问题的大小就会减小。由于数组在每一步都被分成两半,因此执行此操作的次数与 log n 成正比。例如,如果有 8 个元素,则可以将它们分成两半 3 次(因为 log2(8) = 3)。合并(o(n)):划分数组后,算法将较小的数组按顺序合并在一起。合并两个大小为 n 的排序数组需要 o(n) 时间,因为您必须对每个元素进行比较和组合一次。总体复杂度(o(n log n)):由于除法需要 o(log n) 步骤,并且在每一步合并 n 个元素,因此总时间复杂度是这两者的乘积:o(n log n)。 空间复杂度: o(n)合并排序需要与数组大小成正比的额外空间,因为它在合并阶段需要临时数组来存储元素。与其他排序算法的比较:快速排序:虽然快速排序的平均时间复杂度为 o(n log n),但最坏的情况可能是 o(n^2)。合并排序避免了这种最坏的情况,但当空间受到关注时,快速排序对于内存中排序通常更快。冒泡排序:比合并排序效率低得多,平均和最坏情况的时间复杂度为 o(n^2)。真实世界用法合并排序广泛用于外部排序,其中需要从磁盘对大型数据集进行排序,因为它可以有效地处理无法放入内存的数据。它也通常在并行计算环境中实现,其中子数组可以利用多核处理进行独立排序。此外,python (timsort)、java 和 c++ (std::stable_sort) 等库和语言都依赖归并排序的变体来确保排序操作的稳定性,使其特别适合对对象和复杂数据结构进行排序。 结论由于其稳定性、一致的性能以及对大型数据集排序的适应性,合并排序仍然是理论计算机科学和实际应用中的基本算法。虽然 quicksort 等其他算法在某些情况下可能执行得更快,但合并排序保证的 o(n log n) 时间复杂度和多功能性使其对于内存受限的环境以及维护具有相同键的元素的顺序非常有价值。它在现代编程库中的作用确保了它在现实世界的应用程序中保持相关性。来源:knuth,donald e. 计算机编程艺术,卷。 3:排序和搜索。 addison-wesley professional,1997 年,第 158-160 页。cormen,thomas h. 等人。算法简介。麻省理工学院出版社,2009 年,第 2 章(归并排序)、第 5 章(算法复杂性)、第 7 章(快速排序)。silberschatz、亚伯拉罕等人。数据库系统概念。 mcgraw-hill,2010 年,第 13 章(外部排序)。“蒂姆索特。” python 文档、python 软件基础。python 的 timsort“java 数组.排序”。 oracle 文档。java 的 arrays.sort()以上就是揭秘合并排序:分治排序初学者指南的详细内容,更多请关注我的其它相关文章!

标签:10,27,合并,初学者,数组,82,排序,揭秘
From: https://www.cnblogs.com/aow054/p/18434342

相关文章

  • 5款免费可视化工具大揭秘:选择你的最佳助手
    选择合适的可视化工具对于分析和展示数据至关重要,以下是五款免费的可视化工具,它们各具特色,能够适应各种需求。本文将介绍每款工具的优势与不足,帮助你找到最合适的解决方案。1. 山海鲸可视化介绍:山海鲸可视化是一款难得的完全免费的国产报表工具,更难能可贵的是它还提供了完整且......
  • 掌握 JavaScript:初学者的基本技巧
    JavaScript是一种多功能且功能强大的编程语言,构成了现代Web开发的支柱。如果您是JavaScript新手,这里有一些基本技巧可帮助您掌握其概念并开始构建交互式Web应用程序:1.了解基础知识:变量和数据类型:了解变量、它们的类型(数字、字符串、布尔值、对象、数组等)以及如何操......
  • 开发人员人工智能入门:揭秘基础知识部分
    开发者们大家好!人工智能不再只是一个梦想。它就在这里并改变我们构建软件的方式。它可以使应用程序更好、更有用。但如何开始在项目中使用人工智能呢?本系列旨在为您提供踏上人工智能开发之旅的基础知识。在第一部分中,我们将深入研究核心概念并提供使用langchain和openai的实践......
  • 【算法】贪心+堆排序实现大根堆及标准库容器类的融合使用
    ......
  • 如何让智能客服像真人一样对话?容联七陌揭秘:多Agent大模型
    科技云报到原创。经历了多年的“答非所问”、“一问三不知”,很多人已经厌倦了所谓的“智能客服”。哪怕是技术已经非常成熟、可以模拟真人发音的外呼机器人,也会因为“机感”重而被用户迅速挂机或转向人工客服。智能客服似乎遇到了一道坎,在理解用户、和用户对话方面,始终无法实现真正......
  • 算法与数据结构——快速排序
    快速排序快速排序(quicksort)是一种基于分治策略的排序算法,运行高效,应用广泛。快速排序的核心操作是“哨兵划分”,其目标是::选择数组中的某个元素作为“基准数”,将所有小于基准数的元素移到其左侧,而大于基准数的元素移到其右侧。具体流程如下:选取数组最左端元素作为基准数,初始化......
  • 揭秘Dreamforce 2024十大亮点:AI+数据新时代来了!
    一年一度的Dreamforce大会于2024年9月17日至19日如期举行,这场Salesforce的旗舰盛会聚焦于AI与数据的深度融合,带来了诸多革命性发布。无论你是企业用户、Salesforce从业者,还是对AI和数据感兴趣的技术爱好者,以下这十大亮点绝对值得关注。Agentforce:开启企业智能代理人新时代今年......
  • 三大硬核方式揭秘:Java如何与底层硬件和工业设备轻松通信!
    大家好,我是V哥,程序员聊天真是三句不到离不开技术啊,这不前两天跟一个哥们吃饭,他是我好多年前的学员了,一直保持着联系,现在都李总了,在做工业互联网相关的项目,真是只要Java学得好,能干一辈子,卷死的是那些半吊子。感谢李总给我分享了工业互联网项目的事情,收获很多,今天的内容来聊一......
  • 揭秘 Git-stash:掌握暂存技巧,让代码更整洁!
    stash可以冻结目前的状态‍在gitstash出现之前当我们在开发一个新功能的时候,突然来了一个紧急的bug要修复,此时我们可以创建一个分支去修复它;但如果,切换会导致冲突的话,就会切换失败。我们来模拟下(先确保工作区是干净的):$gitbranchbug02$echo"test">>3-branch/br......
  • 算法与数据结构——简单排序算法(选择、冒泡、插入)
    简单排序算法时间复杂度均为O(n2)选择排序选择排序(selectionsort)的工作原理非常简单:开启一个循环,每轮从未排序区间选择最小的元素,将其放到已排序的区间的末尾。算法流程设数组长度为n,选择排序的算法流程如下。初识状态下,所有元素未排序,即未排序(索引)区间为[1,n-1]。选取......