`

递归算法(3)

阅读更多
  1. **  
  2.  *  
  3.  * @author SunnyMoon  
  4.  */  
  5.   
  6. /**  
  7.  * 概念介绍:  
  8.  *   
  9.  * 归并排序:归并算法的中心是归并两个已经有序的数组,并且递归调用归并操作。  
  10.  *   
  11.  * 归并排序优点和缺点:比简单排序在速度上快很多;归并排序会占用双倍的存储空间。  
  12.  *   
  13.  * 归并排序的效率:归并排序的时间复杂度是 O(N*LogN);简单排序的复杂度是O(N2)。  
  14.  */  
  15. public class Recursion3 {   
  16.   
  17.     private long[] theArray;   
  18.     private int nElems;   
  19.   
  20.     public Recursion3(int max) {//初始化数组   
  21.         theArray = new long[max];   
  22.         nElems = 0;   
  23.     }   
  24.   
  25.     public void insert(long value) {//插入数据   
  26.         theArray[nElems] = value;   
  27.         nElems++;   
  28.     }   
  29.   
  30.     public void display() {//显示数组中的数据   
  31.         for (int j = 0; j < nElems; j++) {   
  32.             System.out.print(theArray[j]+","+" ");   
  33.         }   
  34.     }   
  35.     /**  
  36.      * 归并排序算法  
  37.      */  
  38.     public void mergeSort() {   
  39.         long[] workSpace = new long[nElems];//创建一个工作数组,用于排序操作使用   
  40.         recMergeSort(workSpace, 0, nElems - 1);//执行归并排序操作   
  41.     }   
  42.        
  43.     /**  
  44.      * 递归分割数据到基本单位  
  45.      */  
  46.     private void recMergeSort(long[] workSpace, int lowerBound, int upperBound) {   
  47.         if (lowerBound == upperBound) {   
  48.             return;   
  49.         } else {   
  50.             int mid = (lowerBound + upperBound) / 2;   
  51.             recMergeSort(workSpace, lowerBound, mid);   
  52.             recMergeSort(workSpace, mid + 1, upperBound);   
  53.             merge(workSpace, lowerBound, mid + 1, upperBound);   
  54.         }   
  55.     }   
  56.        
  57.     /**  
  58.      * 归并操作将基本单位归并成整个有序的数组  
  59.      */  
  60.     private void merge(long[] workSpace, int lowPtr, int highPtr, int upperBound) {   
  61.         int j = 0;   
  62.         int lowerBound = lowPtr;   
  63.         int mid = highPtr - 1;   
  64.         int n = upperBound - lowerBound + 1;   
  65.   
  66.         while (lowPtr <= mid && highPtr <= upperBound) {   
  67.             if (theArray[lowPtr] < theArray[highPtr]) {   
  68.                 workSpace[j++] = theArray[lowPtr++];   
  69.             } else {   
  70.                 workSpace[j++] = theArray[highPtr++];   
  71.             }   
  72.         }   
  73.             while (lowPtr <= mid) {   
  74.                 workSpace[j++] = theArray[lowPtr++];   
  75.             }   
  76.             while (highPtr <= upperBound) {   
  77.                 workSpace[j++] = theArray[highPtr++];   
  78.             }   
  79.             for (j = 0; j < n; j++) {   
  80.                 theArray[lowerBound + j] = workSpace[j];   
  81.             }   
  82.     }   
  83.     public void println(String str){   
  84.             System.out.println(str);   
  85.         }   
  86. }   
  87.   
  88. class MergeSortApp {//主程序   
  89.   
  90.     public static void main(String[] args) {   
  91.         int maxSize = 100;   
  92.         Recursion3 arr = new Recursion3(maxSize);   
  93.         /**  
  94.          * 插入值到数组  
  95.          */  
  96.         arr.insert(64);   
  97.         arr.insert(21);   
  98.         arr.insert(11);   
  99.         arr.insert(33);   
  100.         arr.insert(12);   
  101.         arr.insert(85);   
  102.         arr.insert(44);   
  103.         arr.insert(99);   
  104.         arr.insert(3);   
  105.         arr.insert(0);   
  106.         arr.insert(108);   
  107.         arr.insert(36);   
  108.            
  109.         arr.println("显示排序前数据:");   
  110.         arr.display();   
  111.         arr.println("");     
  112.            
  113.         arr.mergeSort();   
  114.            
  115.         arr.println("显示排序后数据:");   
  116.         arr.display();   
  117.         arr.println("");     
  118.     }   
  119. }   
  120. /**  
  121.  *   
  122.  * 显示排序前数据:  
  123.  * 64, 21, 11, 33, 12, 85, 44, 99, 3, 0, 108, 36,   
  124.  * 显示排序后数据:  
  125.  * 0, 3, 11, 12, 21, 33, 36, 44, 64, 85, 99, 108,  
  126.  */  
  127.   
  128. /**  
  129.  * 总结:  
  130.  * 归并排序比简单排序的效率高很多,把递归发挥的淋漓尽致,大家可以试一下。  
  131.  * 最后给出归并排序工作过程图解。  
  132.  */  
分享到:
评论

相关推荐

    5!递归算法和非递归算法

    递归算法和非递归算法 在计算机科学与编程领域中,递归算法与非递归算法是两种非常重要的计算方法。本文将详细介绍这两种算法的特点、应用场景以及如何实现它们,特别针对初学者及面试准备者。 #### 递归算法 ...

    VC对磁盘文件遍历搜索的递归算法和非递归算法

    在VC++(Visual C++)环境中,有多种方法可以实现这一目标,其中最常见的是递归算法和非递归算法。这两种方法各有优缺点,适用于不同的场景。 **递归算法**: 递归算法是一种基于函数自身调用解决问题的方法。在...

    .net 递归算法 .net 递归算法.net 递归算法

    在.NET编程环境中,递归算法是一种强大的工具,它允许函数或方法调用自身来解决复杂问题。递归的核心思想是将大问题分解为相同或相似的小问题,直到问题变得足够简单,可以直接得出答案。这种解决问题的方式在数据...

    acm递归算法总结竞赛

    在ACM(国际大学生程序设计竞赛)中,递归算法是一种常见的解决问题的方法,它通过函数自身调用自身来实现问题的解决。递归的核心在于找到基本情况(base case),即可以直接求解的问题,以及每次递归调用时问题规模...

    abap简单递归算法

    ### ABAP简单递归算法解析 #### 一、引言 ABAP(Advanced Business Application Programming)是一种用于SAP系统的编程语言。它不仅支持传统的过程化编程,还支持面向对象编程和Web开发。本文将深入探讨一个ABAP中...

    汉诺塔问题的非递归算法

    对于解决汉诺塔问题,传统方法是通过递归算法实现,即通过不断将问题规模缩小,直到简化到最基本的情况,然后逐步返回并解决每一层的子问题。然而,递归算法在处理大量圆盘时容易引起调用栈过深,导致效率低下。因此...

    快速排序算法设计与分析总结 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现

    快速排序算法设计与分析总结 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现,应包含建树的实现 实现树与...

    18.递归算法与递归算法应用.ppt

    18.递归算法与递归算法应用.ppt

    递归算法与循环算法的分析

    3. 递归算法的优缺点:编写容易,结构清晰,可读性强,但计算速度慢,时间花费较长,效率也会随着问题规模的增大而急剧下降。 4. 循环算法的优缺点:具有较高的效率,但结构较复杂,可读性较差。 5. 算法选择的依据...

    递归算法ppt让你快速上手

    "递归算法ppt让你快速上手" 递归算法是计算机科学中的一种重要算法思想,它可以解决许多复杂的问题。下面是递归算法的知识点总结: 1. 递归的定义:若一个对象部分地包含它自己,或用它自己给自己定义,则称这个...

    合并排序递归和非递归算法

    3. **可读性和实现难度**:递归算法通常代码简洁,易于理解,而非递归算法可能需要更复杂的逻辑来模拟递归行为。 总的来说,选择哪种实现方式取决于具体场景,如内存限制、性能要求以及代码的可读性等。递归版本的...

    程序设计中递归算法

    ### 递归算法在程序设计中的应用 #### 一、递归的概念与本质 递归是一种重要的编程思想,在计算机科学和数学领域都有广泛的应用。它指的是一个过程或函数直接或间接地调用自身来解决问题的方法。递归的核心在于将...

    递归算法专题ppt

    ### 递归算法专题知识点详解 #### 一、递归算法原理 递归算法是一种将问题分解成子问题的方法,其中子问题与原问题性质相同但规模较小。递归算法的关键在于识别出能够通过递归解决的问题,并找到递归的基本情况...

    递归算法转为非递归算法

    递归算法转为非递归算法。方法、过程,用栈的原理

    递归算法的详解,各种常见递归算法

    递归算法是一种强大的编程技术,它通过函数或过程在解决问题时调用自身来解决更小规模的相同问题。递归的基本概念在于一个函数在定义中包含对自身的引用,或者问题的解决方案依赖于较小规模问题的解决方案。在程序...

    Hanoi塔问题的一种非递归算法

    ### Hanoi塔问题的一种非递归算法:深入解析与实现 #### 一、引言 Hanoi塔问题作为计算机科学领域内经典的递归问题之一,因其简洁性和挑战性而广受关注。通常,Hanoi塔问题的解决方案多采用递归算法,尽管其逻辑...

    利用递归算法求阶乘(VB6.0源代码)利用递归算法求阶乘

    在这个主题中,我们将深入探讨如何使用递归算法在VB6.0(Visual Basic 6.0)中计算阶乘。VB6.0是Microsoft开发的一款经典可视化编程环境,用于创建Windows应用程序。 阶乘是一个数学概念,表示一个正整数n的所有...

    中序遍历二叉树非递归算法

    在IT领域,尤其是在数据结构与算法的学习中,中序遍历二叉树的非递归算法是一个关键且实用的知识点。通常,我们首先通过递归来实现二叉树的遍历,但递归方法可能因深度过大导致栈溢出,因此掌握非递归版本的遍历算法...

    使用C++,请给出此题的递归算法及非递归算法。

    在编程领域,递归算法和非递归算法是两种常见的解决问题的方法。递归算法是通过函数或过程调用自身来解决复杂问题的方式,而非递归算法则是通过循环或其他逻辑结构来实现相同的目标。这里我们将详细探讨这两种算法在...

Global site tag (gtag.js) - Google Analytics