介绍
归并排序是一种采用分治思想实现的排序方式,大致的思路如下
把数组从中间分成前后两部分,然后对前后两部分都进行排序(不断分割,分割到一),再把两个排好序的数组合并,就完成啦。
接下来我们详细剖析一下各个步骤,深入理解归并排序。
思路
分解过程
合并过程
实现的细节在代码的注释中,虽然比较多,但希望认真阅读。
下面来看下具体的实现。
实现
1 | public static void mergeSort(int[] a, int n) { |
总结
归并排序是一个稳定的排序算法,其时间复杂度为O(nlogn),空间复杂度:O(n),因为临时的数组大小不会超过n。
时间复杂度简略分析如下,有兴趣的兄弟萌可以看一下。
设求解a的时间为T(a),求解b和c的时间为T(b)、T(c)
则T(a) = T(b) + T(c) + K 其中K是合并需要的时间
设对n个元素进行归并排序的时间是T(n),分解的两个子数组的排序时间是T(n/2),加上合并的n即可
所以公式为 T(n) = 2 * T(n/2) + n;
一步一步分解可以得到 T(n) = 2^kT(n/2^k) + kn, 当T(n/2^k) = T(1)
时,也就是n/2^k = 1,可以得出k = logn
带入上面的公式可得 T(n) = Cn + nlogn,所以时间复杂度是O(nlogn)