归并排序

归并排序是利用递归与分治技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再利用递归方法将排好序的半子表合并成为越来越大的有序序列。
归并排序中,“归“代表的是递归的意思,即递归的将数组折半的分离为单个数组。“并”就是将分开的数据按照从小到大的或者从大到小的顺序放在一个数组里。
算法原理:
  • 对于给定的一组记录(假设n个),首先将每两个相邻的长度为1 的子序列进行归并,得到n/2(向上取整)个长度为2或1的有序子序列,再将其两两归并,反复执行此过程,直到得到一个有序序列。
代码:
public class MergeSorted {
    public static void Merge(int[] arr, int start, int mid, int end){
        int i , j , k;
        int n1 = mid - start + 1;
        int n2 = end - mid;
        int[] larr = new int[n1];
        int[] rarr = new int[n2];
        for (i = start, j = 0; j < n1; i++, j++) {
            larr[j] = arr[i];           
        }
        for (i = mid + 1, j = 0; j < n2; i++, j++) {
            rarr[j] = arr[i];           
        }
        for (k = start, i = 0, j = 0; i< n1 && j < n2; k++) {
            if(larr[i] < rarr[j]){
                arr[k] = larr[i];
                i++;
            }
            else{
                arr[k] = rarr[j];
                j++;
            }
        }
        if(i < n1){
            for (j = i;  j < n1; j++, k++) {
                arr[k] = larr[j];
            }
        }
        if(j < n2){
            for (i = j;  i < n2; i++, k++) {
                arr[k] = rarr[i];
            }
        }
    }
    public static void sorted(int[] arr, int start, int end){
        if(start < end){
            int mid = (start + end)/2;
            sorted(arr, start, mid);
            sorted(arr, mid + 1, end);
            Merge(arr, start, mid, end);
        }
    }
    public static void main(String[] args) {
        int[] a = {3,2,4,5,1,6,7};
        sorted(a, 0, a.length - 1);
        for (int j = 0; j < a.length; j++) {
            System.out.print(a[j] + " ");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值