【java数据结构】归并排序

来源:互联网 发布:熊猫tv淘宝买竹子 编辑:程序博客网 时间:2024/06/14 11:43
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));*/        }    }}
原创粉丝点击