美文网首页
归并排序

归并排序

作者: Jackpot_0213 | 来源:发表于2021-03-14 15:10 被阅读0次

    归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

    作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:

    自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
    自下而上的迭代;


    image.png
    image.png

    算法步骤

    1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;

    2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置;

    3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;

    4. 重复步骤 3 直到某一指针达到序列尾;

    5. 将另一序列剩下的所有元素直接复制到合并序列尾。

    Python

    class Solution:
        def MySort(self , arr ):
            # write code here
            def merge(a, b):
                c = []
                h = j = 0
                while j < len(a) and h < len(b):
                    if a[j] < b[h]:
                        c.append(a[j])
                        j += 1
                    else:
                        c.append(b[h])
                        h += 1
                if j == len(a):
                    for i in b[h:]:
                        c.append(i)
                else:
                    for i in a[j:]:
                        c.append(i)
                return c
            
            def merge_sort(lists):
                if len(lists) <= 1:
                    return lists
                middle = len(lists)//2
                left = merge_sort(lists[:middle])
                right = merge_sort(lists[middle:])
                return merge(left, right)
        
            return(merge_sort(arr))
    

    Java

    public class MergeSort implements IArraySort {
    
        @Override
        public int[] sort(int[] sourceArray) throws Exception {
            // 对 arr 进行拷贝,不改变参数内容
            int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
    
            if (arr.length < 2) {
                return arr;
            }
            int middle = (int) Math.floor(arr.length / 2);
    
            int[] left = Arrays.copyOfRange(arr, 0, middle);
            int[] right = Arrays.copyOfRange(arr, middle, arr.length);
    
            return merge(sort(left), sort(right));
        }
    
        protected int[] merge(int[] left, int[] right) {
            int[] result = new int[left.length + right.length];
            int i = 0;
            while (left.length > 0 && right.length > 0) {
                if (left[0] <= right[0]) {
                    result[i++] = left[0];
                    left = Arrays.copyOfRange(left, 1, left.length);
                } else {
                    result[i++] = right[0];
                    right = Arrays.copyOfRange(right, 1, right.length);
                }
            }
    
            while (left.length > 0) {
                result[i++] = left[0];
                left = Arrays.copyOfRange(left, 1, left.length);
            }
    
            while (right.length > 0) {
                result[i++] = right[0];
                right = Arrays.copyOfRange(right, 1, right.length);
            }
    
            return result;
        }
    
    }
    

    相关文章

      网友评论

          本文标题:归并排序

          本文链接:https://www.haomeiwen.com/subject/cgvxcltx.html