排序算法——归并排序


发布于 2016-07-26 / 47 阅读 / 0 评论 /
归并排序的思想来自于合并两个已排好序的有序表。

1.归并排序定义

对于两个已排序的序列,从头到尾分别顺序访问两个序列,更小的元素,放到一个合并序列的过程,就是归并排序。

归并排序算法就是利用递归和归并实现排序,主要思想是:如果只有一个元素,那么该元素就是一个已经排好序的序列,排序结束。否则对前一半和后一半分别递归调用归并排序函数进行排序,将排好序的两个序列归并起来,就完成了整个序列的排序。

2.归并排序过程

下面通过案例来实现

在第九次比较时,发现Ai指向为空,那就把Bi指向结点及之后的的结点拷贝到C序列中。

3.归并排序复杂度

归并两个有序数组的时间是线性的,如果A序列和B序列共有N个元素,比较次数最多为N-1

归并排序的时间复杂度为O(NlogN)。

归并排序需要额外的空间。

4.归并排序代码实现

java实现代码如下所示:

    public void merge(T[] a, int left, int mid, int right) {
        T[] tmp = new T[right - left + 1];
        int i = left;
        int j = mid;
        int k = 0;
        while (i < mid && j <= right) { // 两个序列都未结束
            if (a[i] < a[j]) {
                tmp[k++] = a[i++];
            } else {
                tmp[k++] = a[j++];
            }
        }
        while (i < mid) { // 第一个序列未结束
            tmp[k++] = a[i++];
        }
        while (j <= right) { // 第二个序列未结束
            tmp[k++] = a[j++];
        }
        for (i = 0, k = left; k <= right ; ) {
            a[k++] = tmp[i++];
        }
    }
    
    public void mergeSort(T[] a, int left, int right) {
        int mid = (left + right) / 2;
        if (left == right) {
            return;
        }
        mergeSort(a, left, mid);
        mergeSort(a, mid + 1, right);
        merge(a, left, mid + 1, right);
    }

    public void mergeSort(T[] a, int size) {
        mergeSort(a, 0, size - 1);
    }