归并排序(Java描述)

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

现象:可比较我的其他博客算法的现象
组建数组元素个数:10000000(千万)
组件随机数组运行时间:162
排序运行时间:1472

import java.util.Random;


public class MergeSort {
    public static void show(int [] a){
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]+"、");
        }
        System.out.println();
    }

    public static int[] get_intarr(int len){
        long begin = System.currentTimeMillis();
        Random ran = new Random();
        int [] result = new int[len];
        for(int i=0;i<len;i++){result[i] = ran.nextInt(10000); }
        long runtime = System.currentTimeMillis()-begin;
        System.out.println("组建数组元素个数:"+len);
        System.out.println("组件随机数组运行时间:"+runtime);
        return result;
    }

    //合并2个有序序列
    public static void MemeryArray(int []a,int []b,int []c){
        int i=0,j=0,k=0;

        //先将2个序列的数据排进c序列
        while(i<a.length && j<b.length){
            if(a[i]<b[j]){
                c[k++] = a[i++];
            }else{
                c[k++] = b[j++];
            }
        }

        while(i<a.length){
            c[k++] = a[i++];
        }

        while(j<b.length){
            c[k++] = b[j++];
        }
    }
    //将2个有序数列a[first.......mid],b[mid+1.....last]合并
    public static void mergearray(int []a,int first,int last,int []tmp){
        int mid = (first+last)/2;
        int i=first,j=mid+1;
        int m=mid,n=last;
        int k=0;

        //有序合并2个序列直至其中一个被遍历完
        while(i<=m && j<=n){
            if(a[i]<a[j]){
                tmp[k++] = a[i++];
            }else{
                tmp[k++] = a[j++];
            }
        }
        while(i<=m){
            tmp[k++] = a[i++];
        }
        while(j<=n){
            tmp[k++] = a[j++];
        }
        //将tmp转移至a中
        for(int l=0;l<k;l++){
            a[first+l] = tmp[l];
        }

    }

    //归并排序核心代码,将a[]循环拆分成有序的数组,然后将这些有序数组合并
    public static void mergesort(int a[],int first,int last,int []tmp){
        if (first < last)  
        {  
            int mid = (first + last) / 2;  
            mergesort(a, first, mid, tmp);    //左边有序  
            mergesort(a, mid + 1, last, tmp); //右边有序  
            mergearray(a, first, last, tmp); //再将二个有序数列合并  
        }  
    }

    public static void main(String[] args) {
        int a[] = get_intarr(10000000);
        int c[] = new int[a.length];
//      mergearray(a,0,2,c);
        long begin = System.currentTimeMillis();
        mergesort(a,0,a.length-1,c);
        long runtime = System.currentTimeMillis()-begin;
        System.out.println("排序运行时间:"+runtime);
//      show(a);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值