java描写的合并排序的递归实现

package com.stu.find;

public class MergeSort {

    public   void  merge(int []A,int p,int q,int r)

    {

        int nl=q-p+1;

        int nr=r-q;

        int [] rArr=new int[nl+1];

        int [] lArr=new int [nr+1];

        for(int i=0;i<nl;i++)

        {

            rArr[i]=A[i+p];

        }

        for(int j=0;j<nr;j++)

        {

            lArr[j]=A[j+q+1];

        }

        rArr[nl] = Integer.MAX_VALUE; 

        lArr[nr] = Integer.MAX_VALUE; 

        int n=0;

        int m=0;

        //接下来进行比较

        for(int i=p;i<=r;i++)

        {

            if(m<=nl&&n<=nr)

            {

                //A[i]=lArr[m]<rArr[n]?lArr[m++]:rArr[n++];

                if(lArr[m]<rArr[n])

                {

                    A[i]=lArr[m];

                    m++;

                }

                else

                {

                    A[i]=rArr[n];

                    n++;

                }

            }

            else

            {

                if(m<nl)

                {

                    A[i]=lArr[m];

                    m++;

                }

                else

                {

                    A[i]=rArr[n];

                    n++;

                }

            }

        }

    }

    public void mergerSort(int []A,int p,int r)

    {   if(p == r){ 

        return

    }else

    {

        int q=(r+p)/2;

        mergerSort(A,p,q);

        mergerSort(A,q+1,r);

        merge(A,p,q,r);

    }

    }

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        int a[]={1,3,2,5,6,4,8,7,9,11,10};

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

        {

            System.out.print(a[i]);

        }

        System.out.println();

        int r=a.length-1;

        System.out.println("长度"+r);

        MergeSort MS=new MergeSort();

        MS.mergerSort(a,0,r);

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

        {

            System.out.print(a[i]+"    ");

        }

        System.out.println();

    }

}

时间: 2024-10-07 19:23:57

java描写的合并排序的递归实现的相关文章

【算法拾遗(java描写叙述)】--- 选择排序(直接选择排序、堆排序)

选择排序的基本思想 每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,知道所有记录排序完毕.主要有两种选择排序方法:直接选择排序(或称简单选择排序)和堆排序. 直接选择排序 基本思想 第i趟排序開始时,当前有序区和无序区分别为R[1 -- i-1]和R[i -- n](1 <= i <= n-1),该趟排序则是从当前无序区中选出关键字最小的记录R[k],将它与无序区的第一个记录R[i]交换,使R[1 -- i]和R[i+1 -- n]分别变为新的有序区和新的无序区.

【LeetCode-面试算法经典-Java实现】【088-Merge Sorted Array(合并排序数组)】

[088-Merge Sorted Array(合并排序数组)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: You may assume that nums1 has enough space (size that is greater or equal to m +

递归与分治-合并排序、快速排序以及循环赛问题

合并排序 合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 递归方法: 基本思想是:将待排序元素分成大小一致相同的2个子集和,分别对两个子集和进行排序,最终将排好序的子集合并成所需要的排好序的集合 package com.gqx.arithmetic.Recursion; public class Recursion_Merge2 { private static void mergeSort(

(2)Java数据结构--二叉树 -和排序算法实现

=== 注释:此人博客对很多个数据结构类都有讲解-并加以实例 Java API —— ArrayList类 & Vector类 & LinkList类Java API —— BigDecimal类Java API —— BigInteger类Java API —— Calendar类Java API —— DateFormat类Java API —— Date类Java API —— HashMap类 & LinkedHashMap类Java API —— JDK5新特性Java

算法导论学习之插入排序+合并排序

最近准备花时间把算法导论详细的看一遍,强化一下算法和数据结构的基础,将一些总结性的东西写到博客上去. 一.插入排序 算法思想:如果一个数组A,从A[1–n-1]都是有序的,然后我们将A[n]插入到A[1–n-1]的某个合适的位置上去那么就可以保证A[1–n]都是有序的.这就是插入排序的思想:具体实现的时候我们将数组的第一个元素看出有序,然后从第二个元素开始按照上面的步骤进行插入操作,直到插入最后一个元素,然后整个数组都是有序的了. 时间复杂度分析:代码中有两重for循环,很容易看出时间复杂度是n

算法实验:分治法合并排序(C++)

这篇文章分两部分来写,第一部分写代码的实现过程,第二部分把实验报告从头到尾呈现出来. 我习惯调试使用的编译器是DEV C++,不是vs系列的,可能头文件上有点区别.但是下面的报告是我放到vs里面测试过的,可以直接用,不影响. 第一部分:(解析) 题目:随机产生一个整型数组,然后用合并排序将该数组做升序排列,要求输出排序前和排序后的数组. 题目分析: 需要随机产生一个整数数组: 采用的算法是合并排序,也就是用归并排序: 输出排序后的数组. 随机产生一个整数数组:这个问题首先想到的是用rand()函

分治——合并排序

分治策略中有一个经典的算法就是合并排序,这个算法的精髓也是分治二字,分而治之.将一个大规模的问题分割成若干个同样的小问题,小问题的规模很小,很容易解决,解决了小的问题后再对这些小问题的结果进行合并得到大规模问题的解答. 合并排序便是分治策略中比较经典的算法,首先是合并,两个排列有序的数列经过合并后成为有序的数组:代码如下: void _merge(int *A,int left,int middle,int right) { int i=left,j=middle+1,k=0; int *C;

算法学习笔记(四):合并排序

算法思想:基本的思想为分治算法,也就是将一个问题分成多个更小的部分递归解决.具体到合并排序,就是将待排序序列分为小的序列,递归进行排序,然后合并. 步骤: 1.分解:将n个元素分成各含n/2个元素的子序列 2.解决:用合并排序对两个子序列递归排序 3.合并:合并两个已排序的子序列以得到排序结果 在对子序列排序时,其长度为1时递归结束. 算法复杂度:O(nlgn) 代码实现: void divide_sort(int arr[],int p,int r) { if(p<r) { int q = (

lintcode 容易题:Merge Sorted Array II 合并排序数组 II

题目: 合并排序数组 II 合并两个排序的整数数组A和B变成一个新的数组. 样例 给出A = [1, 2, 3, empty, empty] B = [4,5] 合并之后A将变成[1,2,3,4,5] 注意 你可以假设A具有足够的空间(A数组的大小大于或等于m+n)去添加B中的元素. 解题: 这里给的是两个数组,上题给的是ArrayList格式,比较好处理,重新定义一个长度m+n的数组,太无节操,其他方法一时想不起来 官方解题,方法很技巧,可以倒着排序,这样就很简单了 Java程序: class