排序算法----归并排序

       归并排序利用了递归的思想以及外部排序。外部排序就是给两个有序数组整体排成一个有序的大数组或者将一个数组分成有序的两部分后进行整体排序,基本过程是由两个指针分别指向两个有序数组的头部位置,然后比较两个指针指向的元素,同时需要一个一个大小为两个有序数组大小之和的辅助数组,比较哪个小就将该元素复制到辅助数组,同时指针向后移一位。当有一个指针已经越界了,说明这个数组上的所有元素都已经移到辅助数组上了,然后把另一个数组的剩下所有元素按原顺序移到辅助数组中。最后将辅助数组中元素按序复制回原数组,归并排序过程结束。

      

package young.unit01;

/**
 * 归并排序
 * 
 * 稳定性:可以做到稳定
 * 就是在每次外排两个有序的部分时,当左右两个指针指到位置上数字相等就复制左边的数字--能保证稳定性
 * @author sunmin
 * @Description:TODO
 * @date:2018年6月17日    下午4:12:48 
 * @Copyright: 2018 www.xy.com. All rights reserved. 
 * 内部代码,严禁外泄
 */
public class T07_MergeSort {

    // O(NlgN)
    public static void mergeSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        mergeProcess(arr, 0, arr.length - 1);
    }
    
    private static void mergeProcess(int[] arr, int L, int R) {
        if (L == R) {
            return;
        }
        int mid = L + (R - L) >> 1;
        mergeProcess(arr, L, mid);
        mergeProcess(arr, mid + 1, R);
        merge(arr, L, mid, R);
    }
    
    private static void merge(int[] arr, int l, int m, int r) {
        int[] help = new int[arr.length];
        int index = 0;
        int p = l;
        int q = m + 1;
        while (p <= m && q <= r) {
            int min = arr[p] < arr[q] ? arr[p++] : arr[q++];
            help[index++] = min;
        }
        while (p <= m) {
            help[index++] = arr[p++];
        }
        while (q <= r) {
            help[index++] = arr[q++];
        }
        for (int i = 0; i < help.length; i++) {
            arr[l + i] = help[i];
        }
    }
}

 

posted @ 2018-07-17 15:36  大将军姜伯约  阅读(102)  评论(0)    收藏  举报