归并算法--MergeSort

来源:互联网 发布:小燕子变真格格知画 编辑:程序博客网 时间:2024/05/21 09:46

三国有云:天下大势分久必合,合久必分。
归并算法就充分表象了这一点,归并算法的基本思想就先将大数组分成小数组,再将小数组分成可以比较大小的两元数组,之后就是合的过程;合的过程中是要对元素进行排序的,两个较小的数组各元素比较后重新排序,再添加到大的数组上,直到合并完成。还是有图好分析问题:
这里写图片描述
百度了一下归并算法,里面只描述归并算法的下半部分,其实分的过程也挺重要,如果不分到最底层,就合得到的结果就不会相同,而且都不知道怎么比较了,之前我没看懂就是在这一点上没有分析到位。如何才能分到最底层,这就需要递归调用了,直到满足条件才开始合的过程。
代码实现:

public class MergeSort implements Sort {    public void sort(int[] data) {        int[] temp = new int[data.length];        mergeSort(data, temp, 0, data.length - 1);        display(data);    }    private void mergeSort(int[] data, int[] temp, int l, int r) {        int mid = (l + r) / 2;        if (l == r) //递归到最底层            return;        mergeSort(data, temp, l, mid); //通过递归分治数组        mergeSort(data, temp, mid + 1, r);//通过递归分治数组        for (int i = l; i <= r; i++) {            temp[i] = data[i];        }        //先排序,后合并        int n = l;        int m = mid + 1;        for (int cur = l; cur <= r; cur++) {             if (n == mid + 1)                data[cur] = temp[m++];            else if (m > r)                data[cur] = temp[n++];            else if (temp[n] < temp[m])                data[cur] = temp[n++];            else                data[cur] = temp[m++];        }    }    public void display(int[] data) {        for (int i = 0; i < data.length; i++) {            System.out.print(data[i] + "-----");        }    }    public static void main(String[] args) {        MergeSort sort = new MergeSort();        int[] array = { 6,202,100,301,38,8,1 };        sort.sort(array);    }}
0 0
原创粉丝点击