【java数据结构】归并排序

package mergeSort;

import java.util.Arrays;

public class MergeSort {
    /**
     * 合并两段有序数组
     * 
     * @param arr
     *            原数组
     * @param start
     *            第一段有序数组的起始下标
     * @param mid
     *            第一段有序数组的结束下标
     * @param end
     *            第二段有序数组的结束下标
     */
    private static void mergeArray(int[] arr, int start, int mid, int end) {
        int i = start, j = mid + 1, k = 0;// i为第一段数组的起始下标,j为第二段数组的起始下标,k为临时数组的下标
        int[] arr2 = new int[end - start + 1];// 临时数组
        while (i <= mid && j <= end) {// 比较两段数组的对应下表处的值,小的放前面(因为都是下标,所以都取等号)
            if (arr[i] <= arr[j]) {
                arr2[k++] = arr[i];
                i++;
            } else {
                arr2[k++] = arr[j];
                j++;
            }
        }
        while (i <= mid) {// 将第一段数组剩下的复制到临时数组
            arr2[k++] = arr[i++];
        }
        while (j <= end) {// 将第二段剩下的复制到临时数组
            arr2[k++] = arr[j++];
        }
        for (i = start, k = 0; i <= end; i++, k++) {// 复制到原数组
            arr[i] = arr2[k];
        }
    }

    /**
     * 全部合并
     * 
     * @param arr
     *            原数组
     * @param gap
     *            每次合并的长度
     * @param length
     *            数组长度
     */
    private static void merge(int[] arr, int gap, int length) {
        int i = 0;
        for (i = 0; i + 2 * gap - 1 < length; i = i + 2 * gap) {// 增量为gap*2
            mergeArray(arr, i, i + gap - 1, i + 2 * gap - 1);
        }
        if (i + gap - 1 < length) {// 对于元素个数为奇数的情况,还剩两个数组,进行归并
            mergeArray(arr, i, i + gap - 1, length - 1);
        }
    }

    /**
     * 排序
     * 
     * @param arr
     *            原数组
     */
    public static void mergeSort(int[] arr) {
        for (int gap = 1; gap < arr.length; gap = gap * 2) {
            merge(arr, gap, arr.length);
            /*System.out.print("gap=" + gap + ": ");
            System.out.println(Arrays.toString(arr));*/
        }
    }
}
posted @ 2017-08-11 11:39  SEC.VIP_网络安全服务  阅读(70)  评论(0编辑  收藏  举报