问题描述写在了代码中,注释可以帮助理解
import java.util.ArrayList;
/**
* @author xusulong
* merge sort
* 分解:将n个元素分成各含/2个元素的子序列
* 解决:用merge sort对两个子序列递归地排序
* 合并:合并两个已排序的子序列以得到排序结果
*/
public class MergeSort {
private final static int max = 1000000;
/**
* 对子数组A[p...r]进行排序
* @param A
* @param p
* @param r
*/
public static void mergeSort(ArrayList<Integer> A, int p, int r) {
//当p = r 时候数组中只有一个元素,不需要排序,而p不可能大于r
if(p < r) {
int q = (p + r)/2;
mergeSort(A, p, q);
mergeSort(A, q + 1, r);
merge(A, p, q, r);
}
}
/**
*
* @param A 数组
* @param p 下标
* @param q 下标
* @param r 下标
* 假设子数组a[p...q]和a[q + 1...r]已经排序好 p <= q < r
*/
public static void merge(ArrayList<Integer> A, int p, int q, int r) {
//length of the child array
int n1 = q - p + 1;
int n2 = r - q;
//create arrays L[1...n1 + 1] and R[1...n2 + 1]
ArrayList<Integer> L = new ArrayList<Integer>(n1 + 1);
ArrayList<Integer> R = new ArrayList<Integer>(n2 + 1);
for(int i = 0; i < n1; i ++) {
L.add(A.get(p + i));
}
L.add(max);
for(int i = 0; i < n2; i ++) {
R.add(A.get(q + i + 1));
}
R.add(max);
for (int i = 0, j = 0, k = p; k <= r; k ++) {
if (L.get(i) <= R.get(j)) {
A.set(k, L.get(i));
i ++;
} else {
A.set(k, R.get(j));
j ++;
}
}
}
public static void main(String[] args) {
ArrayList<Integer> A = new ArrayList<Integer>();
A.add(4);
A.add(2);
A.add(5);
A.add(7);
A.add(0);
A.add(3);
A.add(1);
A.add(6);
mergeSort(A, 0, A.size() - 1);
System.out.println(A);
}
}
时间复杂度cnlog2n + cn 为 O(nlog2n)
分享到:
相关推荐
《算法导论》一书对归并排序进行了深入的探讨和分析,提供了这一经典算法的理论基础和实践指导。 Python作为一种高级编程语言,其简洁的语法和强大的内置库使得它成为实现各种算法的理想选择。在Python中实现归并...
* 排序算法的类型:常见的排序算法有插入排序、归并排序、快速排序等。 * 插入排序算法:插入排序是一种简单的排序算法,它的时间复杂度为O(n^2),空间复杂度为O(1)。 插入排序算法 * 插入排序算法的步骤:插入...
《算法导论》是计算机科学领域的一本经典著作,它为读者提供了全面而深入的算法理论与实践知识。中文第三版的出版,使得更多中国读者能够无障碍地学习这本权威教材。英文版第四版虽然在描述中提及,但主要讨论的重点...
标题和描述中提及的是“完整的算法导论习题答案”,这表明文档包含了针对《算法导论》一书中的练习题解答。《算法导论》是一本经典的计算机科学教材,由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest等...
《算法导论第四版》系统地介绍了多种排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序等。书中不仅解释了每种算法的工作原理和性能特性,还对比了它们在不同情况下的应用效果。此外,作者还...
《算法导论》是计算机科学领域的一本经典教材,由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein四位作者共同编写,广泛应用于全球各大高校的教学中,包括知名的麻省理工学院(MIT)。...
常见的分治法算法包括快速排序、归并排序等。 动态规划 动态规划是指将问题分解成更小的子问题,然后使用动态规划表来解决子问题。常见的动态规划算法包括 Fibonacci 数列、最长公共子序列等。 贪心算法 贪心...
《算法导论》详细讲解了各种排序算法,包括冒泡排序、插入排序、选择排序、归并排序、快速排序和堆排序。其中,快速排序以其高效性和通用性而著名,而堆排序则利用了二叉堆的数据结构,能够在O(n log n)时间内完成...
《算法导论》是计算机科学领域的一本经典著作,它由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein四位作者共同撰写,全面深入地探讨了算法的设计、分析及实现。这本书的第三版更加完善...
2. 设计和实现算法:书中提供了许多经典的算法,如快速排序、归并排序、二分查找等,读者需要学会如何编写这些算法的代码。 3. 数学应用:部分习题涉及到概率、图论、组合数学等领域的知识,这些是理解和设计某些...
排序算法如冒泡排序、插入排序、选择排序、快速排序、归并排序和堆排序各有优缺点,理解它们可以帮助选择在特定场景下最合适的算法。搜索算法如深度优先搜索和广度优先搜索是图算法的基础,而动态规划和贪心策略则常...
根据提供的信息,《算法导论》是一本非常经典的教材,涵盖了计算机科学中算法设计与分析的基础理论及实践应用。下面将针对题目中提到的部分章节进行详细的知识点解析。 ### 第2章:分治法 #### 2.1 分治法概念 - *...
4. 排序算法:介绍各种经典的排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序和基数排序等,分析它们的效率及应用场景。 5. 搜索算法:讲解线性搜索、二分搜索等基础搜索技术,以及散列表和...
同时,还深入探讨了排序和搜索算法,如冒泡排序、快速排序、归并排序、二分查找、哈希表等。此外,书中也讲解了图论中的核心算法,如最短路径算法(Dijkstra、Floyd-Warshall、Bellman-Ford)、最小生成树(Prim、...
1. **递归与分治**:如快速排序、归并排序,它们都是基于分治策略的经典例子,递归是实现这些算法的核心。 2. **动态规划**:如背包问题、最长公共子序列问题,动态规划能有效地解决多阶段决策问题,避免重复计算。...
算法导论第三版答案.pdf 本资源是算法导论第三版答案.pdf的知识点总结,涵盖了算法导论的基本概念和解决方案。 一、算法导论概述 算法导论是计算机科学中的一门基础课程,它研究如何设计、分析和实现高效的算法。...
快速排序、归并排序、堆排序、二分查找、广度优先搜索和深度优先搜索等经典算法的解答,有助于读者深入理解它们的工作原理,从而能够熟练运用在实际编程中。 递归和递推是算法设计中的常见技巧,答案中对这些问题的...
在《算法导论》中,知识点涵盖了基础数据结构(如数组、链表、栈、队列、树和图)、排序与搜索算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序、二分查找、哈希表等)、图算法(如最短路径算法Dijkstra、...
这些算法在日常编程工作中都有广泛的应用,例如,排序算法中的快速排序、归并排序,搜索算法中的二分查找、广度优先搜索等,都是解决实际问题的基础工具。 书中不仅详尽地描述了每种算法的实现步骤,还提供了丰富的...