## 小木学习笔记---Advanced sorting algorithms(1)merge sort 归并排序

小明学习笔记–数据结构与算法(Java)-Advanced sorting algorithms(1)merge sort 归并排序

learning objectives

  • divide-and-conquer strategy(归并思想)
  • pseudocodes and time complexity(伪代码与时间复杂度)
  • apply
    PS: 本文是根据老师PPT和其他博主,结合自己的理解写的。如有失误,还望指教。

归并排序过程解析what is the merge sort?

归并排序是基于分治与递归(divide-and-conquer)的思想的。
主要过程是首先将数据不断对半划分(分治divide)直到称为最小的有序数据单元(0/1个元素)。
再通过递归将最小的两个有序数据单元“排序”并“合并”成大一层级的有序数据单元(这两个较小一层级的有序单元必须是之前划分的过程中,从同一个上一层级划分出来的)
不断递归将两个同级的有序数据单元,排序并合并后,得到原有长度的目标有序序列。

## 小木学习笔记---Advanced sorting algorithms(1)merge sort 归并排序_第1张图片

两个有序数据单元排序并合并的方法论

A,B为两个排好序的数据单元,拿出A,B中第一个元素进行比较,较小的元素放到新的数组(队列)C中(A,B,C 有点类似于“队列”?),同时将这个元素从队列A/B中去除(object dequeue)。(如果是C语言的话可以通过改变指针的位置实现?)
再比较队列A,B中第一个位置的元素大小,较小的元素放到数组C的下一个位置中。直到队列A/B其中一个为空(boolean isEmpty()?,把最后一个元素放到C中,合并结束。

merge sort is based on divide-and-conquer paradigm.

divide-and-conquer分治思想

可以理解为一种非常智慧的目标达成方法。
划分divide :想要达成一个大的目标,先将大的目标拆解成精细的小目标。
**治理conquer :**将小的目标一件一件达成,从而实现短期目标,中期目标,最后达到终极目标。

对于规模较大的问题,可以分解成若干容易求解的简单的问题,最后把解合并构成初始问题的解。
这个思想用在归并排序算法上就是3部曲
1.divide:把数据分成2个半子集(divide the input data S in two disjoint subsets S! and S2)
2.recur: 分别解决两个子问题(solve the subproblem associated with S1 and S2)
3.Conquer: 结合两个子问题的解决结果从而解决大问题(combine the solutions for S1 and S2 into a solution for S)

the base case for the recursion are subproblem of size 0 or 1.
伪代码如下
## 小木学习笔记---Advanced sorting algorithms(1)merge sort 归并排序_第2张图片

你可能感兴趣的:(## 小木学习笔记---Advanced sorting algorithms(1)merge sort 归并排序)