`
thingkau
  • 浏览: 74603 次
  • 性别: Icon_minigender_1
  • 来自: 泉州
社区版块
存档分类
最新评论

消除递归的合并排序

阅读更多
思想:
因为递归法的归并排序实际上是将待排序的无序序列一分为二,直至分解到只剩下一个元素为止,然后不断合并二个排好序的子序列,按此思想可以写出消除递归的合并排序。这里使用的是分治策略。

/**
 * EliminateRecursionMergeSort.java
 * 
 * 非递归法实现合并排序.
 * 
 * @author Administrator
 *
 */
public class EliminateRecursionMergeSort {

	public static void eliminateRecursionMergeSort(int[] a) {
		int[] b = new int[a.length];
		
		int s = 1;	//有序序列的初始长度.
		
		while( s < a.length ) {
			
			Util.mergePass(a, b, s);	//合并数组a中大小为s的相邻元素到数组b.
			
			s*=2;
			
			Util.mergePass(b, a, s);	//合并数组b中大小为s的相邻元素到数组a.
			
			s*=2;
		}
		
	}
		
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		if (args.length == 0) {
			System.out.println("请输入数字以空格隔开");
			System.exit(-1);
		}

		int[] a = new int[args.length];

		for (int i = 0; i < args.length; i++)

			a[i] = Integer.parseInt(args[i]);

		eliminateRecursionMergeSort(a);

		// 输出排序后的数组元素。
		for (int i = 0; i < a.length; i++)
			System.out.println(a[i]);
	}

}

分享到:
评论

相关推荐

    归并排序,消除递归归并排序,快排,Java实现

    这里有三个主要的排序算法:归并排序、消除递归的归并排序和快速排序,它们都是在Java编程语言中实现的。让我们深入探讨这些算法及其Java实现。 1. **归并排序(Merge Sort)** 归并排序是一种基于分治思想的排序...

    分治算法合并排序.docx

    分治算法合并排序 本文介绍了分治算法合并排序的实现细节和实验报告。该实验旨在掌握分治法实现合并排序算法的问题描述、算法设计思想、程序设计和时间复杂度优化。 算法分析 分治算法是一种常用的算法设计思想,...

    分治算法合并排序.pdf

    分治算法合并排序 分治算法是指将一个复杂的问题分解成多个小问题,然后对每个小问题进行解决,最后将结果合并以解决原始问题。合并排序是一种常用的排序算法,它使用分治思想将数组分成小的子数组,然后对每个子...

    通俗易懂,递归函数浏览一遍ppt就能理解

    递归在编程中有着广泛的应用,如树和图的遍历、动态规划、排序算法(如快速排序、归并排序)等。 **递归的基本要素** 1. **基本情况**:这是递归算法的终点,不再继续调用自身,通常是最简单的形式,可以直接得出...

    一个快速排序法的例子

    - **尾递归优化**:通过适当调整分区策略,可以消除递归调用中的尾递归,降低对栈空间的需求。 快速排序在实际应用中非常广泛,尤其适用于大数据量的排序,但由于其非稳定性(相同的元素可能会改变原有的相对顺序)...

    java排序算法包for sdu

    4. 快速排序:利用分治策略,选取一个基准值,将数组分为两部分,一部分所有元素都小于基准,另一部分所有元素都大于基准,然后对这两部分递归进行快速排序,平均时间复杂度为O(n log n)。 5. 归并排序:同样采用...

    ARM嵌入式汇编程序实例排序

    5. 归并排序:通过递归地将数组分成两半,分别排序后再合并,适合大规模数据,但需要额外的内存空间。 四、源代码分析 压缩包中的"EX4_47"可能是一个具体的汇编排序代码实例。分析这个文件可以帮助理解如何在ARM...

    快速排序 分治法——C++代码

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的核心思想是分治法(Divide and Conquer...当然,实际应用中可能需要考虑更多的性能优化,如尾递归消除、内联函数等,以提高程序效率。

    数据结构严蔚敏chapter6recursion.ppt

    它将一个大数组分为两半,对每半进行排序,然后合并两个已排序的半数组。 **8. 消除递归** 虽然递归在某些情况下很有用,但过多的递归调用可能导致栈溢出。可以通过使用循环或其他非递归策略来消除递归,例如使用栈...

    大型保证金分配机的递归特征消除

    在递归特征消除的过程中,算法会对特征进行排序,进而逐步排除掉评价较低的特征,直到留下最重要的特征。这个过程是通过反复的训练和评估来实现的,每次迭代都会去掉一个最不重要的特征,直到最终得到一个特征排名...

    leetcode卡-leetcode_practices_learncard_recursioni:我的leetcode递归练习ilearnc

    2. **尾递归优化**:Java 不像某些语言(如 Scala)支持尾递归优化,即在满足特定条件时消除递归调用的开销。 3. **效率**:虽然递归直观且易于理解,但在某些情况下,迭代可能会更高效,因为它不需要额外的堆栈空间...

    湖北师范大学算法设计与分析试卷知识点

    消除递归通常使用数据结构如栈,通过将递归转换为迭代过程来实现。 3. **分治法**:分治法是一种解决问题的方法,将大问题分解为若干个规模较小但性质相同的子问题,分别解决后组合成原问题的解。这种方法要求原...

    算法分析第3章作业代码

    - **归并排序**:也是基于分治策略,将数组分成两半分别排序,然后合并两个已排序的子数组。 3. **搜索算法**:在第三章中可能也会涵盖基本的搜索算法,如线性搜索和二分搜索。线性搜索在最坏情况下需要检查数组的...

    《算法分析与设计》期末试题及参考答案.doc

    - **分治思路**:不断地将数组分成更小的部分,直到每个部分只包含一个元素,然后逐步合并排序。 - **快速排序**:同样是基于分治法的高效排序算法。选择一个基准元素,将数组分成两部分,左边的元素小于等于基准...

    算法分析与设计考试复习题及参考答案.doc

    消除递归常使用栈或循环结构。 21. **哈密顿环问题**:寻找图中经过每个顶点一次且仅一次的闭合路径。 22. **哈密顿环判定函数**:判断当前路径是否满足所有顶点都被访问且未形成闭环。 23. **Prim算法**:Prim...

    《算法分析与设计》2021复习题.pdf

    消除递归可以采用多种方法,包括使用栈模拟系统递归调用、用递推实现递归、转化为尾递归。 6. 二分搜索算法的时间复杂度是O(logn),合并排序的时间复杂度是O(nlogn),快速排序的平均时间复杂度是O(nlogn),最坏情况...

    算法分析与设计复习题及参考答案.doc

    在递归算法中消除递归调用的方法:** - 使用迭代代替递归; - 通过栈模拟递归过程。 **6. 分支限界法与回溯法的异同:** - **相同点**: 都是通过构建状态空间树来搜索解空间。 - **不同点**: 回溯法采用深度优先...

    《算法分析与设计》期末试题及参考答案.pdf

    消除递归通常需要用到栈,通过循环模拟递归过程。 这些知识点体现了算法设计与分析的核心内容,包括算法的性质、效率分析、搜索策略以及排序算法的设计思想。理解和掌握这些知识对于深入学习计算机科学至关重要。

    算法分析与设计考试复习题及参考答案(吕国英)

    消除递归通常使用栈或循环实现。 21. **哈密顿环问题**:寻找一个起点出发,遍历图中所有顶点且仅遍历一次,最后回到起点的路径。 22. **回溯法求解哈密顿环的判定函数**:检查当前路径是否形成环且访问过所有顶点...

Global site tag (gtag.js) - Google Analytics