`

《Java数据结构和算法》学习笔记(5)——递归 归并排序

阅读更多
每篇笔记都会附上随书的Applet演示程序,有算法看不明白的,可以下载Applet运行起来(直接打开html文件即可),可以很容易地看清楚算法的每一步。
方法调用自身,就构成了递归调用,通常递归都有个终止条件,否则程序无法停止运行。
归并排序

归并排序的原理(升序排序)是将两个有序数组合并成一个有序数组,先对比两个数组的第1项,如果数组a的第1项大于数组b的第1项,那么将数组b的第1项复制到新数组中。接着对比数组a的第1项数组b的第2项,再把更小的一项放到新数组的第2个位置上……直到合并完成。
递归的过程是一个不断分割数组的过程,把原数组不断的分割成两半,直到不能再分割(长度为1),则返回,然后开始合并。
代码如下:
	@SuppressWarnings("unchecked")
	public static <T extends Comparable<? super T>> void mergeSort(T[] array){
		T[] workspace = (T[])new Comparable[array.length];
		recallMergeSort(array, workspace, 0, array.length - 1);
	}
	
	private static <T extends Comparable<? super T>> void recallMergeSort
	(T[] array, T[] workspace, int lowerBound, int upperBound){
		if(upperBound == lowerBound){
			return;
		}else{
			int midIndex = (upperBound + lowerBound) / 2;
			recallMergeSort(array, workspace, lowerBound, midIndex);
			recallMergeSort(array, workspace, midIndex + 1, upperBound);
			merge(array, workspace, lowerBound, midIndex + 1, upperBound);
		}
	}
	
	private static <T extends Comparable<? super T>> void merge
	(T[] array, T[] workspace, int lowerIndex, int higherIndex, int upperBound){
		int i = 0;
		int midIndex = higherIndex - 1;
		int lowerBound = lowerIndex;
		while(lowerIndex <= midIndex && higherIndex <= upperBound){
			if(array[lowerIndex].compareTo(array[higherIndex]) < 0)
				workspace[i++] = array[lowerIndex++];
			else
				workspace[i++] = array[higherIndex++];
		}
		
		while(lowerIndex <= midIndex)
			workspace[i++] = array[lowerIndex++];
		
		while(higherIndex <= upperBound)
			workspace[i++] = array[higherIndex++];
		
		for(i=lowerBound; i<=upperBound; i++)
			array[i] = workspace[i - lowerBound];
	}

归并排序的时间复杂度是O(N*logN),比表插入排序法快得多,但需要多1倍的内存空间。对长度为1万的数组排序,时间几乎算不出来(几乎为0),因为我把数组扩大10倍,经测试,对随机数组进行排序需要0.094秒,逆序排序需要0.11秒。
分享到:
评论

相关推荐

    Java数据结构与算法学习笔记之排序

    Java数据结构与算法学习笔记之排序,主要探讨了六种常见的排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序和快速排序。这些排序算法是计算机科学的基础,无论是在日常开发还是面试中都经常遇到。现在...

    数据结构与算法 学习笔记

    这份"数据结构与算法学习笔记"涵盖了这一领域的核心概念,特别强调了C++模板类的实现,这使得理论知识可以直接应用于实际项目。 首先,我们要了解数据结构。数据结构是组织、存储和管理数据的方式,包括数组、链表...

    java数据结构和算法实现.zip

    Java数据结构和算法实现是计算机...这个"大学生C/C++/JAVA/Python数据结构学习笔记和资料大全"的压缩包,很可能是包含各种语言的数据结构和算法的实例代码、讲解文档、习题集等资源,对于学习者来说是一份宝贵的资料。

    数据结构与算法分析学习笔记

    这份“数据结构与算法分析学习笔记”由罗聪编著,包含了丰富的源代码实例,旨在帮助读者深入理解并掌握这些关键概念。 数据结构是组织和管理数据的方式,它包括数组、链表、栈、队列、树、图等。数组是最基本的数据...

    数据结构与算法学习

    1. 先了解基本概念:从简单的数据结构(如数组、链表)和基础算法(如递归、排序)开始。 2. 实践编码:动手编写和测试代码,这是理解和掌握的关键。 3. 解决问题:参与在线编程挑战,解决实际问题,提升实战能力。 ...

    数据结构与算法学习网站

    - **《算法设计与分析学习笔记》**:通常会涵盖算法设计策略和分析方法。 - **C/C++经典算法大全**:提供了C/C++实现的各种常见算法源代码,方便实践。 - **遗传算法**:介绍了生物进化启发的优化算法,适用于...

    罗聪的数据结构与算法分析学习笔记.rar

    总之,罗聪的数据结构与算法分析学习笔记是学习这个重要领域的宝贵资源,通过系统学习和实践,可以提升编程能力和解决复杂问题的能力。无论是对于初学者还是经验丰富的开发者,深入理解数据结构与算法都能为职业发展...

    数据结构与算法分析 Java语言描述 读书笔记

    - **树**:分层的数据结构,包括二叉树、平衡树(AVL、红黑树)、堆等,适用于搜索和排序。 - **图**:用于表示对象之间的关系,如网络路由、社交网络等。 3. **算法详解**: - **排序算法**:包括冒泡排序、...

    Java数据结构与算法视频44集详解入门

    "Java数据结构与算法视频下载地址.txt"这个文件很可能是提供视频资源的链接,确保下载并按照顺序学习,同时做好笔记,及时复习巩固。通过44集的学习,你将对数据结构和算法有深入的理解,并能将这些知识应用到实际的...

    小码哥《恋上数据结构与算法》学习笔记.zip

    小码哥的学习笔记可能涵盖了这些数据结构的实现、特性分析以及优缺点比较,同时也会通过实际案例来解释各种算法的工作原理和应用场景。例如,他可能会讲解如何使用二分查找来提升搜索效率,或者如何利用动态规划解决...

    数据结构和算法笔记.rar

    这份"数据结构和算法笔记.rar"的压缩包文件显然是为正在学习这一领域的朋友们准备的宝贵资源。下面,我们将深入探讨其中涉及的一些核心概念和知识点。 首先,我们要理解数据结构。数据结构是组织和存储数据的方式,...

    数据结构算法Java实现。关于Java《数据结构算法》核心技术学习积累的例子,是初学者及核心技术巩固的最佳实践。.zip

    此外,算法是解决问题的有效工具,如排序算法(冒泡排序、选择排序、插入排序、快速排序、归并排序等)、搜索算法(深度优先搜索、广度优先搜索)、图遍历算法(深度优先和广度优先)等,都是数据结构算法中的关键...

    算法和数据结构学习笔记.zip

    5. **排序和查找算法**:排序如快速排序、归并排序、堆排序等,查找如二分查找、哈希查找等。理解这些算法能帮助优化数据处理效率。 6. **图算法**:如深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法...

    go数据结构和算法.zip

    这个名为"Go数据结构和算法.zip"的压缩包可能包含了一系列针对这些语言的数据结构和算法的学习资源,特别是针对大学生的学习笔记和资料。下面,我们将深入探讨数据结构和算法在这些语言中的应用和重要性。 首先,...

    常见数据结构及算法(Java语言描述).zip

    在“常见数据结构及算法(Java语言描述).zip”这个压缩包中,我们可以期待找到一系列关于Java实现的数据结构和算法的学习资源。下面,我们将深入探讨这些关键主题。 首先,数据结构是组织、存储和管理数据的方式,...

Global site tag (gtag.js) - Google Analytics