归并排序——Java实现

一、排序思想

      将两个或两个以上的一排序文件合并成一个有序文件的过程叫归并,而归并排序就是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将以有序的了序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为“二路归并”。

二、图解案例

归并排序流程

动画演示

三、代码实现

/**
 * 归并排序序演示
 *
 * @author Lvan
 */
public class MergeSort {
    public static void main(String[] args) {
        int[] arr = {5, 1, 7, 3, 1, 6, 9, 4};

        mergeSort2Down(arr, 0, arr.length - 1);

        for (int i : arr) {
            System.out.print(i + "\t");
        }
    }

    /**
     * 分发器/汇聚器
     *
     * @param arr   待排序列
     * @param start 待排序列起始值
     * @param end   待排序列结束值
     */
    private static void mergeSort2Down(int[] arr, int start, int end) {
        if (arr == null || start >= end) {
            return;
        }

        //获取待排序列中间位置
        int mid = (start + end) / 2;

        //递归排序左边[start,mid]集合
        mergeSort2Down(arr, start, mid);
        //递归排序右边[mid+1,end]集合
        mergeSort2Down(arr, mid + 1, end);

        //合并左边与右边的有序集合
        merge(arr, start, mid, end);
    }

    /**
     * 将两个有序序列合并
     *
     * @param arr   待排序列
     * @param start 待排序列开始值
     * @param mid   待排序列中间位置索引
     * @param end   待排序列结束值
     */
    private static void merge(int[] arr, int start, int mid, int end) {
        //temp用于汇总2个有序集合的临时集合
        int[] temp = new int[end - start + 1];
        //第1个有序集合索引
        int i = start;
        //第二个有序集合索引
        int j = mid + 1;
        //临时集合索引
        int k = 0;

        //将2个有序集合,插入到临时集合temp中
        while (i <= mid && j <= end) {
            if (arr[i] <= arr[j]) {
                temp[k++] = arr[i++];
            } else {
                temp[k++] = arr[j++];
            }
        }

        while (i <= mid) {
            temp[k++] = arr[i++];
        }

        while (j <= end) {
            temp[k++] = arr[j++];
        }

        //将temp中的数据放入arr集合中
        for (i = 0; i < k; i++) {
            arr[start + i] = temp[i];
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/luomeng/p/10612298.html