java 实现二路归并排序

归并排序:是指将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(或有序表)
代码实现二路归并排序如下:

public class MergeSort {
    /*二路归并算法实现数组的排序*/

    /*二路归并*/
    public void MergeTwo(int array[],int low,int mid,int upper){
        /*将有序序列array[low...mid]和有序序列array[mid+1...upper]合并成一个有序序列*/
        /*将两个有序子序列合并,存放于一个临时数组中,合并完成后再复制回原序列数组中*/
        int temp[]=new int[upper-low+1]; // 临时数组
        int low1=low;
        int low2=mid+1;
        int pos=0;
        while(low1<=mid && low2<=upper){//将两个子序列归并
            temp[pos++]=(array[low1]<=array[low2])?array[low1++]:array[low2++];
        }

        /*将两个子序列尚未处理完的部分复制到temp中*/
        while(low1<=mid){
            temp[pos++]=array[low1++];
        }
        while(low2<=upper){
            temp[pos++]=array[low2++];
        }

        /*归并完成,将temp中的元素复制回array中*/
        for(pos=0,low1=low;low1<=upper;pos++,low1++){
            array[low1]=temp[pos];
        }
    }

    /*一趟归并排序*/
    public void Merge(int array[],int len,int n){
        /*将长度为len的序列两两归并,形成长度为n的序列*/
        int i;
        for( i=0;i+2*len-1<n;i=i+2*len){
            MergeTwo(array,i,i+len-1,i+2*len-1);
        }
        if(i+len-1<n){  //对余下的两个子序列归并
            MergeTwo(array,i,i+len-1,n-1);
        }

        /*输出每趟排序的结果*/
        for(i=0;i<n;i++){
            System.out.print(array[i]);
        }
        System.out.println();
    }

    /*二路归并排序*/
    public void mergeSort(int array[],int n){
        int i;
        for(i=1;i<n;i=i*2){  /*需要做log2(n)次排序*/
            Merge(array,i, n);
        }
    }

    public static void main(String[] args) {
        /*使用归并排序法进行排序*/
        int array[]=new int[]{9,8,7,6,5,4,3,2,1};  //把待排序的数存放在数组中
        int n=array.length;
        MergeSort ms=new MergeSort();
        ms.mergeSort(array,n);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值