归并排序

来源:互联网 发布:ug8.0车削加工编程 编辑:程序博客网 时间:2024/05/16 03:07

/*
* 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++;        }    }}