归并排序

/*
* 1、将待排序的数组进行分割,分为两部分,对两部分进行排序,再向下递归。
* 2、将分成的两部分再次分割,直到只剩下一个元素。
* 3、此时结束递归向上返回,退出最后一层递归后,将将倒数第二层分割的两部分合并在一起,
* 之后,依次将各层递归分割开的部分合并,最终合并出有序数组
* 4、合并方法是归并排序的核心部分,
* 1)首先计算当前需要合并的的两个数组的总长度,定义一个temp数组保存合并起来的元素。
* 2)对分割开的两个数组(其实是一个数组,通过控制下标将数组分割)进行循环,同时从两个数组中取出
* 一个元素,比较大小,将小的一个保存到temp数组中,同时将temp的下标指针和取出当前元素的数组的下
* 标指针加一。
* 3)循环结束后进行判断,如果还有一个数组有剩余元素,则将此数组追加到temp数组后,生成的temp数组
* 就是有序的两个分割数组的合并。
* 4)将temp数组保存到原数组中。一次归并结束。
*/

这里写图片描述

package 归并;

public class Demo {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        int[] arr = {1,4,3,5,7,2,9,8,10};
        sort(arr,0,arr.length-1);
        for(int a:arr) {
            System.out.println(a);
        }
    }
    public static void sort(int[] arr,int l_index,int r_index) {
        int mid_index = (l_index+r_index)/2;
        if(l_index<r_index) {
            sort(arr,l_index,mid_index);
            sort(arr,mid_index+1,r_index);
            merge(arr,l_index,mid_index,r_index);
        }
    }

    public static void merge(int[] arr,int l_index,int mid_index,int r_index) {
        int[] temp = new int[r_index-l_index+1];
        int i=l_index,j=mid_index+1,index=0;
        while(i<=mid_index&&j<=r_index) {
            if(arr[i]>arr[j]) {
                temp[index++] = arr[j++]; 
            }else {
                temp[index++] = arr[i++];
            }
        }
        if(i<=mid_index) {
            for(;i<=mid_index;i++) {
                temp[index] = arr[i];
                index++;
            }
        }
        if(j<=r_index) {
            for(;j<=r_index;j++) {
                temp[index] = arr[j];
                index++;
            }
        }
        index = 0;
        for(int k=l_index;k<=r_index;k++) {
            arr[k] = temp[index];
            index++;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值