今天主要复习了一下归并排序。
所谓归并排序,其思想主要是基于分治法的思想。所谓分治法,就是分而治之,将问题变成一个个小问题的总和,再一个个解决小问题,那么总的问题就解决了。
设想一下这样两个升序数组{1,4,7},{2,6,8},如果我们只将这两个数组遍历一遍,然后将这两个数组合并成一个数组并且仍然按从小到大排序,那我们应该怎么做。具体做法那当然是从两个数组的第一个元素出发,进行比较,每次选取最小的数放入一个新的数组中,被选取数后的数组往下遍历,再进行比较,直到一个数组中的元素被拿完时,再将另外数组剩下的数补到新数组后面。
比如对于上述的升序数组,我们先进行1和2的比较,将1放入新数组中,再拿4和2进行比较,将2放入新数组中,依次类推。具体实现代码如下。
或许你会有疑问,为什么要强调升序数组呢,因为如果时两个升序数组,我们只需要将这两个数组各个元素遍历一遍就能得到新的排序好的数组,这样就能降低时间复杂度。这也是归并排序时间复杂度较其他排序时间复杂度较低的原因之一。看到这里你可能会有疑惑了,难道归并排序只能处理两个升序数组吗?那当然不是。设想一下只两个只含有一个元素的数组 ,{1},{2}。那我我们是不是可以按照之前的方法将这两个数组合并成一个数组 。那么对于一段无序序列,{1,6,4,3,9,5},我们可以将其分割成6个只含一个元素的数组,两两进行合并,得到三个升序数组,再合并两个,得到两个升序数组,最后再合并成一个数组(注意,上述方法对数组元素不相同的两个数组同样适用)。最后我们就得到了排序好的数组。其中分割的过程叫做分,合并的过程叫做治。
就先写到这里吧(要睡觉了,明天再完成后续)