Java归并排序算法实现

归并排序算法采用分治法,将已有序的子集合并,以得到完全有序的集

一:创建归并后的集result,其length等同于待归并的两子集length之和
二:创建三个指针,分别指向result集,待归并集ints1,待归并集ints2初始位置
三:判断ints1[i]>ints2[j],将较小者存入result集中,同时将其指针与result集指针同时向后移动
四:重复此步骤,直到某一集的指针指向了末位,将另一集内剩余元素全部归并至result集

Java :

/**
 * 归并排序
 * @author Hector
 *
 */
public class MergeSort {

    /**
     * 传入两个有序集,可以对两个有序集进行归并排序
     * @param ints1
     * @param ints2
     * @return
     */
    public static int[] mergeSort(int[] ints1,int[] ints2){
        //创建结果集,等于待归并集之和
        int[] result = new int[ints1.length+ints2.length];
        //创建result集指针,初始指向首位
        int resultIndex = 0;
        //创建比较值
        int ints1Index = 0;
        int ints2Index = 0;
        //为result结果集首位赋值
        do{
            //当待归并集1/待归并集2所使用指针指向末位,则退出算法
            if(ints1Index>ints1.length-1||ints2Index>ints2.length-1){
                //当待某归并集指针并未指向末尾时,证明该集并未完全归并,直接归并
                if(ints1Index!=ints1.length){
                    System.arraycopy(ints1, ints1Index, result, resultIndex+1, ints1.length-ints1Index);
                }
                if(ints2Index!=ints1.length){
                    System.arraycopy(ints2, ints2Index, result, resultIndex+1, ints2.length-ints1Index);
                }
                break;
            }
            //判断待归并集,若集1指针所指位置比集2末位要大,则证明集1余下元素皆大于集2,直接归并
            if(ints1[ints1Index]>ints2[ints2.length-1]){
                System.arraycopy(ints1, ints1Index, result, resultIndex+1, ints1.length-ints1Index);
            }
            //判断待归并集,若集2指针所指位置比集1末位要大,则证明集2余下元素皆大于集1,直接归并
            if(ints1[ints1Index]<ints2[ints2.length-1]){
                System.arraycopy(ints2, ints2Index, result, resultIndex+1, ints2.length-ints2Index);
            }

            if(ints1[ints1Index]<ints2[ints2Index]){
                result[resultIndex] = ints1[ints1Index];
                ints1Index++;
            }else{
                result[resultIndex] = ints2[ints2Index];
                ints2Index++;
            }
            resultIndex++;
        //此条件可证明result结果集并未完全接受归并结果
        }while(result[result.length-1]==0);
        return result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值