• 常见排序算法(六)-归并排序


    归并排序(Merge Sort)

      和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。

      归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。 

    算法描述

    • 把长度为n的输入序列分成两个长度为n/2的子序列;
    • 对这两个子序列分别采用归并排序;
    • 将两个排序好的子序列合并成一个最终的排序序列。

    动图演示

      

    import java.util.Arrays;
    
    public class MergeSort {
        public static void main(String[] args) {
            int[] array = {4,6,2,14,12,36,5,95,41,75,11,21,14};
            for (int i : mergeSort(array)) {
                System.out.print(i + " ");
            }
        }
        /**
         * 归并排序
         * @param array
         * @return
         */
        public static int[] mergeSort(int[] array) {
            if (array.length < 2) return array;
            int mid = array.length / 2;
            int[] left = Arrays.copyOfRange(array, 0, mid);
            int[] right = Arrays.copyOfRange(array, mid, array.length);
            return merge(mergeSort(left), mergeSort(right));
        }
        /**
         * 归并排序——将两段排序好的数组结合成一个排序数组
         * @param left
         * @param right
         * @return
         */
        private static int[] merge(int[] left, int[] right) {
            int[] result = new int[left.length + right.length];
            for (int index = 0, i = 0, j = 0; index < result.length; index++) {
                if (i >= left.length)
                    result[index] = right[j++];
                else if (j >= right.length)
                    result[index] = left[i++];
                else if (left[i] > right[j])
                    result[index] = right[j++];
                else
                    result[index] = left[i++];
            }
            return result;
        }
    }

    算法分析

    最佳情况:T(n) = O(n)  最差情况:T(n) = O(nlogn)  平均情况:T(n) = O(nlogn)

  • 相关阅读:
    Final发布
    Final发布 视频展示
    Final发布 文案+美工展示
    PSP总结报告
    作业 20181204-1 每周例行报告
    对团队成员公开感谢
    作业 20181127-1 附加作业 软件工程原则的应用实例分析
    作业 20181127-2 每周例行报告
    作业 20181120-1 每周例行报告
    作业 20181113-2 每周例行报告
  • 原文地址:https://www.cnblogs.com/FondWang/p/12575200.html
Copyright © 2020-2023  润新知