美文网首页
归并排序

归并排序

作者: 币来币往 | 来源:发表于2018-12-05 11:56 被阅读0次

归并排序的核心思想是分治算法,顾名思义就是,将大问题分成小问题,小问题都解决了,大问题也就解决了。解决分治问题最常用的编程技巧就是递归
写递归代码的技巧就是,先分析得出递推公式,然后找出终止条件,最后将递推公式翻译成递推代码。
我们先通过一张图来看一下归并算法的思想

image.png
递推公式:
merge_sort(p…r) = merge(merge_sort(p…q), merge_sort(q+1…r))

终止条件:
p >= r 不用再继续分解

其中,merge_sort(p...r)表示对数组中下表为p到r的元素进行排序。我们将这个问题转换为对两个子数组merge_sort(p…q) 和 merge_sort(q+1…r)排序,最好再将排序后的子数组结果合并,得到p到r直接数据的排序结果。
有上面的图我们可以看出,当我们将数组切分到只有一个或者0个元素的时候数组自然就有序了,这时再往上依次合并即可。
下面是java代码实现:

package sort.basic;

import org.junit.Test;

public class MergeSort {
    public void mergeSort(int[] data, int start, int end){
        if (start >= end){
            return;
        }
        int mid = (end - start)/2 + start;
        mergeSort(data, start, mid);
        mergeSort(data, mid + 1, end);
        merge(data, start, mid, end);
    }

    private void merge(int[] data, int start, int mid, int end) {
        int[] temp = new int[end - start + 1];
        int index = 0;
        int start1 = start;
        int start2 = mid + 1;
        while(start1 <= mid || start2 <= end){
            if(start1 > mid){
                while(start2 <= end){
                    temp[index++] = data[start2++];
                }
                break;
            }
            if(start2 > end){
                while(start1 <= mid){
                    temp[index++] = data[start1++];
                }
                break;
            }
            if(data[start1] <= data[start2]){
                temp[index++] = data[start1++];
            }
            else {
                temp[index++] = data[start2++];
            }
        }
        for(int i = start; i <= end; i++){
            data[i] = temp[i - start];
        }
    }

    @Test
    public void sortTest(){
        int[] data = new int[]{11,8,3,9,7,1,2,5};
        mergeSort(data, 0, data.length-1);
        for(int ele : data){
            System.out.print(ele + " ");
        }
        System.out.println();
    }
}

缺点: 观察merge函数,我们发现mergesort的每次合并都需要额外的空间,空间复杂度为O(n).
快速排序 之所以比归并排序应用范围广,就在于其s空间复杂度为O(1)

相关文章

  • 排序算法

    约定 选择排序 冒泡排序 插入排序 希尔排序 归并排序1. 归并方法2. 自顶向下归并排序3. 自底向上归并排序 ...

  • 排序二:归并、快排

    文章结构 归并排序 快速排序 源码 1. 归并排序 1.1 什么是归并排序 归并排序的思想是:将待排序的区间平分成...

  • java归并排序

    归并排序什么是归并排序:图解归并排序归并排序有两种实现方式,一是基于递归,而是基于迭代1)基于递归的归并排序: 基...

  • 算法—排序篇2

    1、归并排序(Merging Sort) 归并排序(Merging Sort): 就是利用归并的思想实现排序⽅法....

  • 常见的排序算法(2)

    要点 快速排序 归并排序 1.快速排序 2.归并排序

  • 排序算法之归并排序

    归并排序(Merge Sort) 归并排序是利用归并的思想实现排序的方式,该算法采用的是经典的分治算法 归并排序过...

  • 算法 第二章第二部分笔记

    各种排序算法的性能特点 选择排序 插入排序 希尔排序 归并排序 本地归并排序 自底向上的归并排序 快速排序 三向切...

  • 归并排序(二路归并排序)

    归并排序的思路 归并排序是通过“归并”操作完成排序的,将两个或者多个有序子表归并成一个子表。归并排序是“分治法”的...

  • 算法排序之归并排序和快速排序

    归并排序和快速排序用的都是分治的思想,用递归的编程技巧来实现.咱们先来看归并排序. 归并排序 归并排序的核心思想就...

  • 基于左闭右开的乱序数组归并排序 2020-04-24(未经允许,

    归并排序代码模板 递归形式思路:二分nums数组后对nums的归并排序 = 对左侧数组归并排序+对右侧数组归并排序...

网友评论

      本文标题:归并排序

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