zoukankan      html  css  js  c++  java
  • 算法-归并排序


    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));
        }
    }
    
  • 相关阅读:
    Vue快速学习_第四节
    Vue快速学习_第三节
    Vue快速学习_第二节
    从N个元素的集合中随机取m个元素的算法实现
    Mysql加锁过程详解
    TFS 测试用例导入、导出工具
    TFS实现需求工作项自动级联保存
    Gulp自动构建Web前端程序
    Oracle PL/SQL Developer集成TFS进行团队脚本文件版本管理
    Python sphinx-build在Windows系统中生成Html文档
  • 原文地址:https://www.cnblogs.com/cloudflow/p/13894354.html
Copyright © 2011-2022 走看看