`
xusulong
  • 浏览: 80979 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

算法导论 归并排序

阅读更多

问题描述写在了代码中,注释可以帮助理解

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)

0
0
分享到:
评论

相关推荐

    python实现归并排序 –算法导论

    《算法导论》一书对归并排序进行了深入的探讨和分析,提供了这一经典算法的理论基础和实践指导。 Python作为一种高级编程语言,其简洁的语法和强大的内置库使得它成为实现各种算法的理想选择。在Python中实现归并...

    麻省理工学院算法导论笔记.pdf

    * 排序算法的类型:常见的排序算法有插入排序、归并排序、快速排序等。 * 插入排序算法:插入排序是一种简单的排序算法,它的时间复杂度为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)。...

    算法导论(英文原版教材).pdf

    常见的分治法算法包括快速排序、归并排序等。 动态规划 动态规划是指将问题分解成更小的子问题,然后使用动态规划表来解决子问题。常见的动态规划算法包括 Fibonacci 数列、最长公共子序列等。 贪心算法 贪心...

    算法导论答案算法导论教师手册

    《算法导论》详细讲解了各种排序算法,包括冒泡排序、插入排序、选择排序、归并排序、快速排序和堆排序。其中,快速排序以其高效性和通用性而著名,而堆排序则利用了二叉堆的数据结构,能够在O(n log n)时间内完成...

    算法导论.rar

    《算法导论》是计算机科学领域的一本经典著作,它由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein四位作者共同撰写,全面深入地探讨了算法的设计、分析及实现。这本书的第三版更加完善...

    算法导论中文第三版习题答案

    2. 设计和实现算法:书中提供了许多经典的算法,如快速排序、归并排序、二分查找等,读者需要学会如何编写这些算法的代码。 3. 数学应用:部分习题涉及到概率、图论、组合数学等领域的知识,这些是理解和设计某些...

    算法导论(原书第3版) 中文完整版带目录

    排序算法如冒泡排序、插入排序、选择排序、快速排序、归并排序和堆排序各有优缺点,理解它们可以帮助选择在特定场景下最合适的算法。搜索算法如深度优先搜索和广度优先搜索是图算法的基础,而动态规划和贪心策略则常...

    算法导论课后答案

    根据提供的信息,《算法导论》是一本非常经典的教材,涵盖了计算机科学中算法设计与分析的基础理论及实践应用。下面将针对题目中提到的部分章节进行详细的知识点解析。 ### 第2章:分治法 #### 2.1 分治法概念 - *...

    算法导论中文版

    4. 排序算法:介绍各种经典的排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序和基数排序等,分析它们的效率及应用场景。 5. 搜索算法:讲解线性搜索、二分搜索等基础搜索技术,以及散列表和...

    算法导论 中英文高清版本

    同时,还深入探讨了排序和搜索算法,如冒泡排序、快速排序、归并排序、二分查找、哈希表等。此外,书中也讲解了图论中的核心算法,如最短路径算法(Dijkstra、Floyd-Warshall、Bellman-Ford)、最小生成树(Prim、...

    算法导论第三版及2-25章部分答案

    1. **递归与分治**:如快速排序、归并排序,它们都是基于分治策略的经典例子,递归是实现这些算法的核心。 2. **动态规划**:如背包问题、最长公共子序列问题,动态规划能有效地解决多阶段决策问题,避免重复计算。...

    算法导论第三版答案.pdf

    算法导论第三版答案.pdf 本资源是算法导论第三版答案.pdf的知识点总结,涵盖了算法导论的基本概念和解决方案。 一、算法导论概述 算法导论是计算机科学中的一门基础课程,它研究如何设计、分析和实现高效的算法。...

    算法导论第二版课后答案中文完全版

    快速排序、归并排序、堆排序、二分查找、广度优先搜索和深度优先搜索等经典算法的解答,有助于读者深入理解它们的工作原理,从而能够熟练运用在实际编程中。 递归和递推是算法设计中的常见技巧,答案中对这些问题的...

    算法导论第二版课后答案完全版

    在《算法导论》中,知识点涵盖了基础数据结构(如数组、链表、栈、队列、树和图)、排序与搜索算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序、二分查找、哈希表等)、图算法(如最短路径算法Dijkstra、...

    算法导论(第二版)清晰版

    这些算法在日常编程工作中都有广泛的应用,例如,排序算法中的快速排序、归并排序,搜索算法中的二分查找、广度优先搜索等,都是解决实际问题的基础工具。 书中不仅详尽地描述了每种算法的实现步骤,还提供了丰富的...

Global site tag (gtag.js) - Google Analytics