排序算法之归并排序

1468669076

这次带来的是归并排序算法,怪我以前无知,只会了快排,冒泡,选择,插入等,也是没听数据结构课的后果,看了下书查了资料对归并排序有了深入了理解,归并归并,先递归后合并,先来张图看看你就理解了,如图

看完是不是感觉归并排序很简单拉哈,思路大概是这样:每次对半分组分组,分到每个1组然后进行比较大小合并数组

Java代码实现如下:

/**

  • 归并排序

  • @author Ape

  • /
    public class Gsort {

    static int[] array = new int[] { 1, 80, 116, 165, 20, 51 };

    // 将有二个有序数列合并
    static void mArray(int[] a, int[] t, int start, int mid, int end) {

    // s1-e1为第一段,s2-e2为第二段
    int s1 = start, e1 = mid , s2 = mid + 1, e2 = end;
    int n = 0;
    // 从每组的第一个数开始判断
    while (s1 <= e1 && s2 <= e2) {
        if (a[s1] <= a[s2])  // 若第一个组的数小
            t[n++] = a[s1++];
        else
            t[n++] = a[s2++];
    }
    // 把剩下的数拼上去
    while (s1 <= e1)
        t[n++] = a[s1++];
    while (s2 <= e2)
        t[n++] = a[s2++];
    for (int i = 0; i < n; i++)
        a[start + i] = t[i];

    }

    static void sort(int a[], int[] t, int start, int end) {

    if (start < end) {
        // 每次对半分
        int mid = (start + end) / 2;
        sort(a, t, start, mid);
        sort(a, t, mid + 1, end);
        mArray(a, t, start, mid, end);
    }

    }

    public static void main(String[] args) {

    // TODO Auto-generated method stub
    int length = array.length;
    int[] t = new int[length];
    sort(array, t, 0, length - 1);
    for (int i = 0; i < length - 1; i++)
        System.out.print(array[i] + " - ");

    }

}