热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

归并排序递归与迭代实现c++

递归实现就是树的后序遍历voidmergeSort_recursive(vector&arr,intstart,intend){闭区间[start,end]if(st

递归实现就是树的后序遍历

void mergeSort_recursive(vector<int> &arr, int start, int end)
{// 闭区间[start, end]if (start >&#61; end){return;}int mid &#61; start &#43; ((end - start) >> 1);// 注意(end&#43;start)/2 当end&#61;start&#43;1时&#xff0c;mid&#61;start&#xff0c;// 因此[start,mid-1], [mid,end]这种分区方式会造成死循环&#xff0c;因为第二个区间大小总是不变mergeSort_recursive(arr, start, mid);mergeSort_recursive(arr, mid &#43; 1, end);// 使用临时数组合并两个已经排好序的数组int len &#61; end - start &#43; 1;vector<int> tmp(len);int idx &#61; 0;for (int i &#61; start, j &#61; mid &#43; 1; i <&#61; mid || j <&#61; end;){int left &#61; i <&#61; mid ? arr[i] : INT_MAX;int right &#61; j <&#61; end ? arr[j] : INT_MAX;if (left <&#61; right){tmp[idx&#43;&#43;] &#61; arr[i&#43;&#43;];}else {tmp[idx&#43;&#43;] &#61; arr[j&#43;&#43;];}}// 使用临时数组覆盖相应部分for (int i &#61; 0; i < len; i&#43;&#43;){arr[start &#43; i] &#61; tmp[i];}
}

迭代实现思路&#xff1a;先合并长度为1的数组&#xff0c;然后在合并长度为2、4、8的数组。
归并排序的迭代实现不推荐使用像快速排序那样直接使用栈模拟递归&#xff0c;后序遍历会麻烦很多&#xff01;

void merge_sort(int arr[], int len)
{int *a &#61; arr;int *b &#61; (int *)malloc(len * sizeof(int));int seg, start;for (seg &#61; 1; seg < len; seg &#43;&#61; seg) // seg 表示合并的数组长度&#xff0c;从两个长度为1的开始&#xff0c;逐渐增大{for (start &#61; 0; start < len; start &#43;&#61; seg &#43; seg){int low &#61; start, mid &#61; min(start &#43; seg, len), // 使用min考虑区间长度不够的情况high &#61; min(start &#43; seg &#43; seg, len);// 合并这两个数组int k &#61; low; // k为辅助数组的起始下标int start1 &#61; low, end1 &#61; mid;int start2 &#61; mid, end2 &#61; high;while(start1 < end1 || start2 < end2){int left &#61; start1<end1?a[start1]:INT_MAX;int right &#61; start2<end2?a[start2]:INT_MAX;if(left <&#61;right){b[k&#43;&#43;]&#61;a[start1&#43;&#43;];}else{b[k&#43;&#43;]&#61;a[start2&#43;&#43;];}}}// 数组在b中存着&#xff0c;交换a、b可以继续操作&#xff0c;注意的是&#xff0c;循环结束时&#xff0c;最终结果在a中int *temp &#61; a;a &#61; b;b &#61; temp;}// 可能交换了奇数次或者偶数次if (a !&#61; arr) // 说明此时a指向的是辅助数组&#xff0c;b指向的是原数组{int i;for (i &#61; 0; i < len; i&#43;&#43;)b[i] &#61; a[i]; // 使用辅助数组的值覆盖原数组b &#61; a; // b再次指向辅助数组}free(b);
}


推荐阅读
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • 具备括号和分数功能的高级四则运算计算器
    本研究基于C语言开发了一款支持括号和分数运算的高级四则运算计算器。该计算器通过模拟手算过程,对每个运算符进行优先级标记,并按优先级从高到低依次执行计算。其中,加减运算的优先级最低,为0。此外,该计算器还支持复杂的分数运算,能够处理包含括号的表达式,提高了计算的准确性和灵活性。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • 本文探讨了利用JavaScript实现集合的对称差集算法的方法。该算法旨在处理多个数组作为输入参数,同时保留每个数组中元素的原始顺序。算法不会移除单个数组内的重复元素,但会删除在不同数组之间出现的重复项。通过这种方式,能够有效地计算出多个数组的对称差集。 ... [详细]
  • 本文探讨了 Java 中 Pair 类的历史与现状。虽然 Java 标准库中没有内置的 Pair 类,但社区和第三方库提供了多种实现方式,如 Apache Commons 的 Pair 类和 JavaFX 的 javafx.util.Pair 类。这些实现为需要处理成对数据的开发者提供了便利。此外,文章还讨论了为何标准库未包含 Pair 类的原因,以及在现代 Java 开发中使用 Pair 类的最佳实践。 ... [详细]
  • 贪心策略在算法设计中的应用与优化
    贪心算法在算法设计中具有广泛的应用,特别是在解决优化问题时表现出色。本文通过分析经典问题“买卖股票的最佳时机II”,探讨了贪心策略的基本原理及其在实际问题中的应用。通过实例分析,展示了贪心算法如何通过局部最优选择逐步达到全局最优解,并讨论了其在时间和空间复杂度上的优势。此外,还提出了一些优化方法,以提高算法的效率和适用性。 ... [详细]
  • AIX编程挑战赛:AIX正方形问题的算法解析与Java代码实现
    在昨晚的阅读中,我注意到了CSDN博主西部阿呆-小草屋发表的一篇文章《AIX程序设计大赛——AIX正方形问题》。该文详细阐述了AIX正方形问题的背景,并提供了一种基于Java语言的解决方案。本文将深入解析这一算法的核心思想,并展示具体的Java代码实现,旨在为参赛者和编程爱好者提供有价值的参考。 ... [详细]
  • 深入理解 Java 控制结构的全面指南 ... [详细]
  • 无论是计算机专业学生还是非计算机专业的学习者,在掌握C语言的过程中可能会遇到诸多挑战,不清楚从何入手。为此,本文系统地梳理了2019年福建省C语言的核心知识点,并结合最新的技术进展进行了详细总结,旨在为初学者提供全面的学习指导。文章不仅涵盖了基础语法和数据结构,还深入探讨了指针、内存管理和算法优化等高级主题,帮助读者快速提升编程能力。 ... [详细]
  • 深入解析C语言中的动态规划算法:以背包问题为例
    本文深入探讨了C语言中动态规划算法的应用,以经典的背包问题为例进行详细解析。通过实例分析,展示了如何利用动态规划解决复杂优化问题,并提供了高效的代码实现方法。文章不仅涵盖了算法的基本原理,还讨论了其在实际编程中的应用技巧和优化策略,为读者提供了全面的理解和实践指导。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • Java解析YAML文件并转换为JSON格式(支持JSON与XML的结构化查询)
    本文探讨了如何利用Java解析YAML文件并将其转换为JSON格式,同时支持JSON和XML的结构化查询。YAML、JSON和XML这三种数据格式通过其名称作为文件扩展名,便于区分和使用。文章详细介绍了这些格式的层次结构和数据表示方法,并重点讨论了在数据传输过程中,XML的特性和优势。此外,还提供了具体的代码示例和实现步骤,帮助开发者高效地进行数据格式转换和查询操作。 ... [详细]
  • 本文深入探讨了URAL 1297问题,重点分析了使用后缀数组求解最长回文子串的方法。通过详细解析算法的实现步骤和优化策略,本文提供了高效的解决方案,并结合实际案例进行了验证。此外,文章还讨论了后缀数组在字符串处理中的广泛应用及其性能优势。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • 在编程笔试和面试中,全排列算法因其适中的难度而备受青睐,不仅能够考察应聘者的算法基础,还能测试其对递归和回溯的理解。本文将深入解析全排列算法的实现原理,探讨其应用场景,并提供优化建议,帮助读者更好地掌握这一重要算法。 ... [详细]
author-avatar
气质女__人爱美必修课
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有