为了简单起见,使用int类型数组讲述归并算法,后面扩展到其他类型的排序。
目录
1.1 用具体例子说明
十人排序问题。
- 将十人均分为两队
- 五人分为三人,二人两队
- 对于三人的队伍,再次分成两人和一人的队伍
- 对于两人的队伍分成一人一队
- 循环上面几步,直到有十队时,结束。
- 那么此时所有队伍都是一人一队
- 找到相邻的两队进行有序合并。
- 循环上一步直到只有一个队伍时截止。
- 此时就已经完成了排序
1.2 排序思想
分而治之:将一个大数组均分为两个大小相等的数组(奇数容量下有 1 的差值),然后进行排序的话,时间就从对T = O(n^2)操作变成了2*O((n/2)^2) =2*O((n^2)/4) = O(n^2) / 2 = T / 2,时间缩小了一倍,我们将这个过程循环下去,直到所有数组都被分成一个元素为止,由归纳可得时间为O(n*lgn),之后进行循环有序合并,那么明显时间为O(n),舍去,所以归并排序将基础排序中的O(n^2)改进为了O(n*lgn);有效的改进了时间复杂度。
1.3 见名知意
归并排序就是将原来的数组分为两个小的数组就行排序之后进行合并,因为常常使用递归实现(由先拆分后合并的性质决定的),所以我们称其为归并排序。
1.4 抽象过程
- 对于一个大小为n的待排序数组,将其划分为n个小数组,即每个数划分为一个数组,对于只有一个元素的数组,那么该数组有序。
- 有序合并相邻相同大小的数组,即合并两个有序数组为一个有序数组。
- 循环上一步直到所有小数组合并到一个数组中为止。
- 此时排序就已经在不断的有序中完成,数组有序。
1.5 实例操作
1.6 代码实现(JAVA版本)
这个排序属于高级排序,比较抽象,所以我划分为多个方法进行实现,力求每个方法都不难理解。
而且因为归并排序是java语言底层的Arrays.sort()的实现,所以力求学会归并,并且可以看懂sort源码。
1.6.1调用排序部分
// 两次入口以便他人调用(Java底层的sort就是这么做的)
public static void mer