`
tw5566
  • 浏览: 457825 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

算法学习(10)-递归 之归并排序

阅读更多
package com.tw.dst.recursive;

/**  
 * <p>
 * 算法学习 ----递归
 * 概念介绍:
 * 归并排序:归并算法的中心是归并两个已经有序的数组,并且递归调用归并操作。   
 * 归并排序优点和缺点:比简单排序在速度上快很多;归并排序会占用双倍的存储空间。  
 * 归并排序的效率:归并排序的时间复杂度是 O(N*LogN);简单排序的复杂度是O(N2)。</p>
 * @author tangw 2010-12-13
 */  
public class MergeRecursion3 {   
  
    private long[] theArray;   
    private int nElems;   
    /**
     * <p>初始化数组</p> 
     * @param max
     */
    public MergeRecursion3(int max) {  
        theArray = new long[max];   
        nElems = 0;   
    }   
  
    /**
     * <p>插入数据</p>
     * @param value
     */
    public void insert(long value) {   
        theArray[nElems] = value;   
        nElems++;   
    }   
    /**
     * <p>显示数组中的数据</p>
     */
    public void display() {
        for (int j = 0; j < nElems; j++) {   
            System.out.print(theArray[j]+","+" ");   
        }   
    }   
    /**  
     * <p>归并排序算法</p>
     */  
    public void mergeSort() {   
        long[] workSpace = new long[nElems];//创建一个工作数组,用于排序操作使用   
        recMergeSort(workSpace, 0, nElems - 1);//执行归并排序操作   
    }   
       
    /**
     * <p>递归分割数据到基本单位 </p> 
     * @param workSpace
     * @param lowerBound
     * @param upperBound
     */
    private void recMergeSort(long[] workSpace, int lowerBound, int upperBound) {   
        if (lowerBound == upperBound) {   
            return;   
        } else {   
            int mid = (lowerBound + upperBound) / 2;   
            recMergeSort(workSpace, lowerBound, mid);   
            recMergeSort(workSpace, mid + 1, upperBound);   
            merge(workSpace, lowerBound, mid + 1, upperBound);   
        }   
    }   
       
	/**
	 * 归并操作将基本单位归并成整个有序的数组 
	 * @param workSpace
	 * @param lowPtr
	 * @param highPtr
	 * @param upperBound
	 */
    private void merge(long[] workSpace, int lowPtr, int highPtr, int upperBound) {   
        int j = 0;   
        int lowerBound = lowPtr;   
        int mid = highPtr - 1;   
        int n = upperBound - lowerBound + 1;   
  
        while (lowPtr <= mid && highPtr <= upperBound) {   
            if (theArray[lowPtr] < theArray[highPtr]) {   
                workSpace[j++] = theArray[lowPtr++];   
            } else {   
                workSpace[j++] = theArray[highPtr++];   
            }   
        }   
        while (lowPtr <= mid) {   
            workSpace[j++] = theArray[lowPtr++];   
        }   
        while (highPtr <= upperBound) {   
            workSpace[j++] = theArray[highPtr++];   
        }   
        for (j = 0; j < n; j++) {   
            theArray[lowerBound + j] = workSpace[j];   
        }   
    }
    
    
    public void println(String str){   
            System.out.println(str);   
    }   
    
    
    public static void main(String[] args) {   
        int maxSize = 100;   
        MergeRecursion3 arr = new MergeRecursion3(maxSize);   
        /**  
         * 插入值到数组  
         */  
        arr.insert(64);   
        arr.insert(21);   
        arr.insert(11);   
        arr.insert(33);   
        arr.insert(12);   
        arr.insert(85);   
        arr.insert(44);   
        arr.insert(99);   
        arr.insert(3);   
        arr.insert(0);   
        arr.insert(108);   
        arr.insert(36);   
           
        arr.println("显示排序前数据:");   
        arr.display();   
        arr.println("");     
           
        arr.mergeSort();   
           
        arr.println("显示排序后数据:");   
        arr.display();   
        arr.println("");     
    } 
}

/**  
 *   
 * 显示排序前数据:  
 * 64, 21, 11, 33, 12, 85, 44, 99, 3, 0, 108, 36,   
 * 显示排序后数据:  
 * 0, 3, 11, 12, 21, 33, 36, 44, 64, 85, 99, 108,  
 */  
  
/**  
 * 总结:  
 * 归并排序比简单排序的效率高很多
 */  

 

分享到:
评论

相关推荐

    算法-理论基础- 排序- 归并排序(包含源程序).rar

    归并排序是一种经典的排序算法,基于分治策略。在计算机科学中,分治法是一种将大...通过深入学习和理解归并排序,你可以提升在算法设计和数据结构方面的技能,这对于解决复杂的编程问题和参与算法竞赛都非常有帮助。

    归并排序算法实现(排序算法系列1)

    通过查看和分析这段代码,我们可以更深入地理解归并排序的内部机制,学习如何在实际编程项目中应用这种排序算法。 总结来说,归并排序是一种分治策略的体现,具有稳定且高效的排序性能。它通过递归或迭代的方式分割...

    算法设计实验报告-快速排序和归并排序

    **算法设计实验报告** 在计算机科学中,排序是数据处理中的基本...通过本实验报告,读者不仅能掌握快速排序和归并排序的基本原理,还能通过实践提升对算法设计与分析的理解,为进一步深入学习和应用排序算法奠定基础。

    MATLAB实现插入排序、二分归并排序、归并排序.rar

    在本资源中,我们主要关注的是使用MATLAB编程语言实现三种经典的排序算法:插入排序、二分归并排序以及归并排序。这些算法是计算机科学基础中的重要组成部分,特别是在算法设计与分析领域。MATLAB是一种强大的数值...

    数据库系统实现-两阶段多路归并排序算法的C实现

    总的来说,两阶段多路归并排序算法是数据库系统中实现高效排序的关键技术之一。通过理解其原理和C语言的实现,开发者能够更好地优化数据库查询性能,提高系统整体效率。对于学习数据库系统实现的读者来说,这个实验...

    直接插入排序 冒泡排序 快速排序 直接选择排序 堆排序 二路归并排序 C#源代码

    直接插入排序、冒泡排序、快速排序、直接选择排序、堆排序和二路归并排序是计算机科学中经典的排序算法,它们在数据处理和算法学习中占有重要地位。这些排序算法各有特点,适用场景不同,下面将逐一详细介绍,并结合...

    归并排序算法(C语言)

    总之,归并排序作为计算机科学中的经典排序算法之一,其在C语言中的实现不仅体现了算法设计的精妙之处,也展示了C语言作为系统级编程语言的强大功能。对于学习数据结构和算法的学生来说,掌握归并排序的原理及其...

    算法-基础算法- 递归算法(包含源程序).rar

    - **分治算法**:如快速排序、归并排序等,它们将大问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解。 - **树和图的遍历**:如深度优先搜索(DFS)和二叉树的前序、中序和后序遍历。 ...

    LUT算法与数据结构-- 递归替换和图书管理

    6. **排序算法**,如快速排序或归并排序:对图书进行排序展示。 7. **搜索算法**,如二分查找:在有序数据结构中快速定位书籍。 项目中的源码可能会包括这些数据结构的实现以及相应的操作函数,而文档则可能详述...

    快速排序算法以及归并算法

    根据给定的文件信息,我们将深入探讨两种经典的排序算法——快速排序和归并排序,并结合Java语言实现进行详细解析。 ### 快速排序算法 快速排序是一种高效的排序算法,采用分而治之的策略,其核心思想是选择一个...

    改进的归并排序算法

    归并排序(Merge Sort)是一种基于分治策略的高效排序算法。它的基本思想是将大问题分解成小问题,然后逐个解决小...分析和理解这段代码可以帮助我们深入理解归并排序的原理,并学习如何优化经典算法以适应特定需求。

    6种排序算法选择排序,冒泡排序,插入排序基数排序,快速排序,归并排序

    - 归并排序是建立在归并操作上的一种有效的排序算法,它采用了分治的策略,将大问题分解为小问题来解决。 - C++实现归并排序时,首先将数组分为两半,分别对左右两部分进行排序,然后将两个已排序的子数组合并为一...

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

    在本篇《Java数据结构和算法》学习笔记中,我们将深入探讨递归和归并排序。递归是一种强大的编程技术,常用于解决复杂问题,而归并排序则是利用递归实现的一种高效排序算法。 首先,让我们理解什么是递归。递归是...

    JavaSwing归并排序动画源码(含其他排序)

    归并排序是一种高效的、稳定的排序算法,它的基本思想是将大问题分解为小问题来解决,通过递归地将两个或更多有序数组合并成一个有序数组。 归并排序的工作原理可以分为以下几个步骤: 1. **分割**:将原始数组...

    105、第6课 统计数字--归并排序(count)--2020.03.23a.pdf

    根据提供的文件内容,本文将详细解读归并排序算法以及与之相关的编程实现。归并排序是一种有效的、稳定的排序算法,具有时间复杂度为O(nlogn)的特点。在教学少儿编程NOIP和CSP-J(计算机软件能力认证)的过程中,...

    归并排序算法

    归并排序是一种经典的排序算法,基于“分治”策略。它的基本思想是将大问题分解成小问题来解决,然后再将解决的小问题合并成大问题的解。在归并排序中,我们将一个大数组分成两个小数组,分别对这两个小数组进行排序...

    基于python的排序算法-归并排序Merge Sort

    归并排序(Merge Sort)是一种高效的、稳定的排序算法,它采用了...在压缩包文件"基于python的排序算法-归并排序Merge Sort"中,可能包含的就是关于这个话题的详细讲解、代码示例或其他相关资料,可供深入学习和实践。

    Java ArrayList实现的快排,归并排序,堆排序

    在Java编程中,排序是数据处理的一个重要...以上就是关于使用ArrayList实现快速排序、归并排序和堆排序的详细解析,这些排序算法是数据结构和算法学习中的经典内容,理解和掌握它们对于提升编程能力有着重要的作用。

    归并排序单步演示软件

    通过观察和交互,用户可以深入理解归并排序的工作原理,提升编程技能,为后续的算法学习和实际项目开发打下坚实基础。而wan这个文件名可能是程序的可执行文件或源代码文件,用于在本地运行和研究归并排序的动态过程...

Global site tag (gtag.js) - Google Analytics