• 算法-归并排序



    title: 算法-归并排序
    date: 2020-06-30 01:28:52
    tags: Algorithm
    category: Algorithm

    对两个有序数组进行排序:

    将arr数组中,左右两个有序数组分别复制到两个数组中,逐个比较,再放到原数组中,这样原数组有序。(或者利用双指针遍历,复制到一个新的数组中)

    代码:

    public void merge(int[] arr, int L, int R, int M) {
            int leftSize = M - L;
            int rightSize = R - M + 1;
    
            int[] left = new int[leftSize];
            int[] right = new int[rightSize];
    
            for (int i = L; i < M; ++i)
                left[i-L] = arr[i];
            for (int j = M; j <= R; ++j)    // j<=R 需要注意
                right[j-M] = arr[j];
    
            int i = 0, j = 0, k = L;    // k=L 需要注意,不是0
            while (i < leftSize && j < rightSize) {
                if (left[i] < right[j])
                    arr[k++] = left[i++];
                else
                    arr[k++] = right[j++];
            }
    
            while (i < leftSize)
                arr[k++] = left[i++];
            while (j < rightSize)
                arr[k++] = right[j++];
        }
    

    对一组乱序数组进行排序:
    递归,使数组的左右两个子数组有序,直至递归到左右两个数组都只有一个元素,然后再执行上面的merge操作。

    代码:

    public void mergeSort(int[] arr, int L, int R) {
            if (L == R)
                return;
            else {
                int M = (L + R) / 2;
                mergeSort(arr, L, M);
                mergeSort(arr, M + 1, R);
                merge(arr, L, R, M + 1);
            }
        }
    

    完整代码:

    public class MergeSort {
    
        /**
         * 对两个有序的数组进行排序
         * @param arr 排序的数组,L~M,M+1~R 之间是有序的
         */
        public void merge(int[] arr, int L, int R, int M) {
            int leftSize = M - L;
            int rightSize = R - M + 1;
    
            int[] left = new int[leftSize];
            int[] right = new int[rightSize];
    
            for (int i = L; i < M; ++i)
                left[i-L] = arr[i];
            for (int j = M; j <= R; ++j)    // j<=R 需要注意
                right[j-M] = arr[j];
    
            int i = 0, j = 0, k = L;    // k=L 需要注意,不是0
            while (i < leftSize && j < rightSize) {
                if (left[i] < right[j])
                    arr[k++] = left[i++];
                else
                    arr[k++] = right[j++];
            }
    
            while (i < leftSize)
                arr[k++] = left[i++];
            while (j < rightSize)
                arr[k++] = right[j++];
        }
    
        public void mergeSort(int[] arr, int L, int R) {
            if (L == R)
                return;
            else {
                int M = (L + R) / 2;
                mergeSort(arr, L, M);
                mergeSort(arr, M + 1, R);
                merge(arr, L, R, M + 1);
            }
        }
    
    
        public static void main(String[] args) {
            int[] arr = {6, 3, 2, 7, 5, 1, 4, 0, 8, 9};
    
            MergeSort sort = new MergeSort();
            sort.mergeSort(arr, 0, arr.length-1);
    
            System.out.println(Arrays.toString(arr));
        }
    }
    
  • 相关阅读:
    十条jQuery代码片段助力Web开发效率提升
    C#如何释放已经加载的图片 (转)
    获取文件夹下最新文件 (转)
    时间格式转换
    调整ListBox控件的行间距及设置文本格式
    c++builder调用vc的dll
    mws文件中的tab文件改为相对路径
    .net 对配置文件内容的操作
    winform下mapxtreme2008 v7.0 生成release版提示找不到dll问题
    vue实现按字母A-Z选择城市
  • 原文地址:https://www.cnblogs.com/cloudflow/p/13894354.html
Copyright © 2020-2023  润新知