`
tw5566
  • 浏览: 449084 次
  • 性别: 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,  
 */  
  
/**  
 * 总结:  
 * 归并排序比简单排序的效率高很多
 */  

 

分享到:
评论

相关推荐

    C#递归算法之快速排序

    2)递归算法之归并排序  上一篇学习中介绍了了递归算法在排序中的一个应用:归并排序,在排序算法中还有一种算法用到了递归,那就是快速排序,快速排序也是一种利用了分而治之策略的算法,它由C.A.R发明,它依据...

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

    NULL 博文链接:https://yuan.iteye.com/blog/308778

    Java排序算法三之归并排序的递归与非递归的实现示例解析

    主要介绍了Java排序算法三之归并排序的递归与非递归的实现示例解析,文章通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    学习数据结构和算法分析的一些实例,包括排序算法、搜索算法、递归、二叉树等等实例.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    数据结构与常见算法,从递归开始,排序,至链表,队列,栈,树,图等。.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    数据结构算法与应用-C++语言描述

    14.2.2 归并排序 443 14.2.3 快速排序 447 14.2.4 选择 452 14.2.5 距离最近的点对 454 14.3 解递归方程 462 14.4 复杂性的下限 463 14.4.1 最小最大问题的下限 464 14.4.2 排序算法的下限 465 第15章 动态规划 467 ...

    常用排序算法C语言示例代码解说PDF

    个人原创总结的常用排序算法C语言示例代码解说PDF...包含有直接插入排序,折半插入排序,2路直接插入排序,起泡排序,简单选择排序,快速排序,堆排序,(希尔排序,归并排序,基数排序为空白),供学习排序算法的爱好者参考。

    各种排序算法完整代码实现.txt

    主要包括冒泡排序(两种思路实现)、冒泡排序的改进算法、选择排序法、插入排序法(两种实现方式)、快速排序法、归并排序法 (递归实现和非递归实现),该资料为本人亲自整理,且代码完整、注释全面!

    数据结构算法与应用-C__语言描述

    14.2.2 归并排序 443 14.2.3 快速排序 447 14.2.4 选择 452 14.2.5 距离最近的点对 454 14.3 解递归方程 462 14.4 复杂性的下限 463 14.4.1 最小最大问题的下限 464 14.4.2 排序算法的下限 465 第15章 动态规划 467 ...

    算法数据结构学习视频教程,算法和数据结构的基础概念、进阶技巧以及特定算法的应用和实现

    第5节 归并排序及其相关面试题.mp4 第6节 归并排序附加题、随机快速排序.mp4 第7节 堆和堆排序.mp4 第8节 加强堆.mp4 第9节 前缀树、不基于比较的排序、排序稳定性.mp4 第10节 排序总结、链表相关面试题.mp4 第11节 ...

    leetcode部分排序类-coding-interview-notes::pencil:我的编码面试学习笔记

    归并排序 动态规划 向量/数组列表 快速排序 大O时空 哈希表 了解编码面试 能够识别编码问题中的模式也很有价值,这是 . 破解编码面试 我还将通过这本经典书籍中的章节来更好地进行编码面试。 注意:我有这本书的第 6...

    04_第四章 快速排序(分而治之)

    学习快速排序法——一种优雅的排序算法。比第二章介绍的选择排序快的多。使用的是分而治之的策略。 目录 分而治之 快速排序 再谈大O表示法 分而治之 分而治之并非可用于解决问题的算法,而是一种解决思路。 使用...

    算法分析与设计 课程作业 完整版.docx

    1.归并排序 2.快速排序 3.折半查找 4.选择问题 5.最大子段 第四章——贪心算法 1.背包问题 2.多机调度问题 3.单源最短路径-Dijkstra算法 4.最小代价生成树问题-Prim算法 5.最小代价生成树问题-Kruskal算法 第五章...

    Java数据结构和算法中文第二版

    归并排序 消除递归 一些有趣的递归应用 小结 问题 实验 编程作业 第7章 高级排序 希尔排序 划分 快速排序 基数排序 小结 问题 实验 编程作业 第8章 二叉树 为什么使用二叉树? 树的术语 一个类比 ...

    数据结构考研纲要

    ②多趟归并排序 (3)归并排序 (4)m路归并;m+1个缓冲区:m个输入一个输出(并行处理加倍) (5)为减少平衡归并中外存读写次数;增大归并路数和减少归并段数 (6)败者树增大归并路数 (7)置换选择排序增大归并段长度,...

    算法导论中文版

     27.3 多线程归并排序  思考题  本章注记 第28章 矩阵运算  28.1 求解线性方程组  28.2 矩阵求逆  28.3 对称正定矩阵和最小二乘逼近  思考题  本章注记 第29章 线性规划  29.1 标准型和松弛型  ...

    Java数据结构和算法(第二版)

    归并排序 消除递归 一些有趣的递归应用 小结 问题 实验 编程作业 第7章 高级排序 希尔排序 划分 快速排序 基数排序 小结 问题 实验 编程作业 第8章 二叉树 为什么使用二叉树? 树的术语 一个类比 二叉搜索树如何...

Global site tag (gtag.js) - Google Analytics