归并排序需要两个部分,第一个是归并(merge)部分, 第二个是排序(sort)部分。
一、原理
1、merge部分
先定义以下变量
int start; 起始点
int end; 终止点(包含)
int part; 分离点
假设数组从start到part(包含)部分是排好序的,从part+1到end(包含)部分也是有序的,归并过程就是把start到end的所有元素进行排序。
归并过程主要分三个主要步骤
1)定义两个数组
int[] left; 保存start到part(包含)部分的数据
int[] right; 保存part+1到end(包含)部分的数据
2)循环比较数组left和right元素大小,取出较小的,按顺序保存在输出数组result(int[] result)中
3)left和right中其中必有一个先取完,把未取完数组剩下的元素(本来就是有序的)直接按顺序复制到result中
merge过程结束
2、sort部分
主要思想是先确定part的大小, 然后对start到part(包含)部分和part+1到end(包含)部分分别排序(递归实现),最后调用1中的merge进行归并,最终实现对整个数组的排序:代码如下
二、JAVA实现
代码如下:
三、讨论
归并排序和快速排序的排序过程代码类似,都是利用递归实现排序。
归并排序是确定分离点,然后对两个部分分别递归排序,最后归并;
快速排序是先根据给定的key,将数组分成小于key和不小于key两部分(或者类似的分为大于key和不大于key两部分),然后对两部分分别递归排序。
所以总体来说,归并排序是先递归,再归并;快速排序是先分组,再递归。