归并排序算法

package 排序算法.归并排序;

import java.util.Arrays;

/**
 * 归并排序是典型的分治法应用,
 * 总共分为两大步,
 * 第一步:对给定待排序数组分解成两部分(主要采用递归的方法),每部分是有序的;
 * 第二步,合并这两部分;
 */
public class MegerSort {
    public static void main(String[] args) {

        int[] array = {0,12,-5,3,8,4,2,-7,1};
        mergerSort(array, 0, array.length-1);
        System.out.println(Arrays.toString(array));
    }

    //递归这个方法分解待排序数组
    public static void mergerSort(int[] arry,int low,int high){
        //递归终止的出口
        if(low >= high){
            return;
        }
        int mid = (low + high) / 2;
        //分而治之左区间
        mergerSort(arry, 0, mid);
        //分而治之右区间
        mergerSort(arry, mid+1, high);
        //合并
        meger(arry,low,mid,high);
    }

    //合并的方法
    public static void meger(int[] arry,int low,int mid,int high){
        int s1 = low; //第一个归并段的初始位置
        int s2 = mid+1; // 第二个归并段的初始位置

        //声明一个用于存放元素的数组
        int[] res = new int[high - low + 1];
        int i = 0;//表示res数组的下标

        //要保证两个归并段都有数据
        while(s1 <= mid && s2 <= high){
            if(arry[s1] < arry[s2]){
                res[i] = arry[s1];
                s1++;
                i++;
            }else{
                res[i] = arry[s2];
                s2++;
                i++;
            }
        }

        //如果只剩下一个归并段时
        while (s1 <= mid){
            res[i] = arry[s1];
            s1++;
            i++;
        }
        while (s2<= high){
            res[i] = arry[s2];
            s2++;
            i++;
        }
        //每次合并完将res数组放到array数组合适的位置
        for(int j = 0;j<res.length;j++){
            arry[j+low] = res[j];
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值