`

《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++实现的各种常见算法源代码,方便实践。 - **遗传算法**:介绍了生物进化启发的优化算法,适用于...

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

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

    数据结构和算法笔记.rar

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

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

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

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

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

    go数据结构和算法.zip

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

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

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

    学习数据结构和算法过程中的笔记

    学习数据结构与算法的过程,不仅需要理解这些基本概念,还要通过实践来加深理解,例如编写程序实现各种数据结构和算法,通过实际问题来锻炼分析和解决问题的能力。只有这样,才能真正掌握数据结构与算法的精髓,提升...

    《数据结构与算法之美》学习笔记及Swift代码实现,原始库httpsgithub.comwangzheng0822alg.zip

    这个仓库很可能包含了各种数据结构(如数组、链表、栈、队列、树、图等)和算法(如排序、搜索、递归、动态规划等)的实例代码。通过这个仓库,你可以深入理解每种数据结构和算法的工作原理,并看到它们如何在实际的...

    数据结构与算法系列笔记.zip

    这一系列笔记涵盖了从基础知识到高级概念的广泛内容,旨在帮助学习者系统地掌握数据结构和算法的核心原理。以下是笔记中可能涉及的主要知识点: 1. **数组**:数组是最基础的数据结构,它允许通过索引访问元素。...

    数据结构与算法源代码(C++版)

    在压缩包的“数据结构C++版(光盘)”中,我们可以期待找到上述所有数据结构和算法的源代码实例,这对于学习和实践来说极其宝贵。通过阅读和调试这些代码,你可以深入理解每种数据结构和算法的工作原理,提升编程...

    (小甲鱼)数据结构与算法笔记.zip

    排序算法(冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等)是数据结构与算法课程中的核心内容,它们比较和交换元素以达到有序状态。查找算法如二分查找、哈希查找则用于在特定数据结构中找到目标元素...

Global site tag (gtag.js) - Google Analytics