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

    归并排序,也就是将一个数组无限次的对半拆分 一直拆分数量为1的时候 将两个数量为1的数组比较大小合并为有序的,再依次往上合并
    如果班上有10个小学生{1, 5, 2, 6, 7, 3, 4, 8,9,10} 先将小学生分成2组,A组{1,5,2,6,7}和B组{3,4,8,9,10}
    再将A组拆分为两组 A1组{1,5},A2组{2,6,7}
    A1组再拆分为A11{1} A12{5} 将A11 和A12合并得出A1{1,5}
    A2组拆分为A21{2},A22{6,7}
    A22组拆分为A221{6} A222{7}
    先合并A221 和A222 得出A22{6,7}
    A21 和A22合并 得出A2{2,6,7}
    A1和A2合并 得出A{1,2,5,6,7}
    同理 B组归并之后为{3,4,8,9,10}
    最后A组和B组合并 结果为{1,2,3,4,5,6,7,8,9,10}
    讲一下怎么合并的 拿A组和B组归并来说
    A组{1,2,5,6,7}
    B组{3,4,8,9,10}
    先建一个结果数组result 长度为A.length+B.length 长度为10
    开始从A组和B组数字里找数字填入result
    两个变量i 和j 分别表示数组A和B的索引
    可能存在一种情况 如果i >=A.length 那就说明A组中的数组取完了 直接拿B的就好 同理j >=B.length 就说明B组中的数取完了
    假设正常比较 那应该是比较 A[i]和B[j]的值哪个符合条件 如果A符合条件 那么result[index]=A[i] 赋值完后将i++ 下一次比较就从A组里的下一个元素开始
    代码:
      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);
            int[] int1 = mergeSort(left);
            int[] int2 = mergeSort(right);
            int[] merge = merge(int1, int2);
            return merge;
        }
    
        /**
         * 归并排序——将两段排序好的数组结合成一个排序数组
         *
         * @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;
        }


    不和别人一样,不复制只真正理解
  • 相关阅读:
    LeetCode "Jump Game"
    LeetCode "Pow(x,n)"
    LeetCode "Reverse Linked List II"
    LeetCode "Unique Binary Search Trees II"
    LeetCode "Combination Sum II"
    LeetCode "Divide Two Integers"
    LeetCode "First Missing Positive"
    LeetCode "Clone Graph"
    LeetCode "Decode Ways"
    LeetCode "Combinations"
  • 原文地址:https://www.cnblogs.com/Vinlen/p/12896163.html
Copyright © 2011-2022 走看看