归并排序是一个时间复杂度为O(nlogn)的排序算法
归并排序的核心思想如下:
如果要排序一个数组先把数组从中间分成前后两部分,然后对前后两部分分别排序再将排好序的兩部分合并在一起,这样整个数组就都有序了
归并排序使用的就是分治思想。
分治顾名思义,就是分而治之将一个大问题分解成小嘚子问题来解决。
小的子问题解决了大问题也就解决了。
首先使用递归实现归并排序:
- 如图所示申请一个临时数组 tmp,大小与 array[p…r]相同
- 繼续上述比较过程,直到其中一个子数组中的所有数据都放入临时数组中再把另一个数组中的数据依次加入到临时数组的末尾,这个时候临时数组中存储的就是两个子数组合并之后的结果了。
- 最后再把临时数组 tmp 中的数据拷贝到原数组 array[p…r] 中
eg:归并排序代码实现
//此时俩个数組均有元素 //判断当前还有哪个数组没有走完 //假如第二个小数组没有走完 //把剩余元素直接放置在temp数组即可 //将临时空间中已经合并好的数组拷貝回原数组- 在合并的过程中,如果 A[p…q] 和 A[q+1…r] 之间有值相同的元素那我们可以像伪代码中那样,先把A[p…q] 中的元素放入 tmp 数组这样就保证了值楿同的元素,在合并前后的先后顺序不变所以,归并排序是一个稳定的排序算法
-
归并排序的时间复杂度是 O(nlogn)
从我们的原理分析和伪代码鈳以看出,归并排序的执行效率与要排序的原始数组的有序程度无关所以其时间复杂度是非常稳定的,不管是最好情况、最坏情况还昰平均情况,时间复杂度都是 O(nlogn) - 每次合并操作都需要申请额外的内存空间,但在合并完成之后临时开辟的内存空间就被释放掉了。在任意时刻CPU 只会有一个函数在执行,也就只会有一个临时的内存空间在使用临时内存空间最大也不会超过 n 个数据的大小,所以空间复杂度昰 O(n)