参考文章的地址:http://www.cnblogs.com/skywang12345/p/3602369.html
归并排序基本原理是将两个有序的数组,在合并的过程中进行排序成一个更大的有序数组。
归并排序的时间复杂度为NlogN,缺点是需要额外的内存空间
归并排序的实现方法是:创建一个适当大小的数组然后将两个输入数组中的元素一个个从小到大的放入这个数组中。
将两个数组抽象化的归并方法如下:
方法名为merge(a,lo,mid,hi),它会将子数组a[lo...mid] a[mid+1...hi]归并成一个有序的数组并将结果存放在a[lo...hi]中,
public static void merge(Comparable[] a, int lo, int mid, int hi){
//将a[lo...mid] 和a[mid+1...hi]归并
int i = lo; // 第一个有序区域的索引
int j = mid +1; //第二个有序区域的索引
for(int k = lo; k <= hi; k++){//将a[lo...hi]复制到aux[lo...hi]中,这样在操作a[]是数据不会被覆盖而丢
aux[k] = a[k]; //aux[] 是在类中建立的一个辅助数组,它的大小和a[]的大小一样大
}
for(int k = lo; k <=hi; k++){ //归并到a[lo...hi]中
if(i > mid){ //左半边用尽,也就是当第一个有序数组的所有数据都放入到归并的数组中了,由于上一次结果会i++,
//所以会进入到这个条件中,那就直接把右边的往归并数组里扔就可以了
a[k] = aux[j++];
}else if(j > hi){ //同上,当右半边数据(第二个有序区域)都放入到归并的数组中了,那就直接吧剩下的左边数据(第一个有序数组)放入归并数组
a[k] = aux[i++];
}else if(less(aux[j], aux[i])){//这句话才是归并在比较大小的那句,谁小谁放入数组中
a[k] = aux[j++];
}else{
a[k] = aux[i++];
}
}
}
归并排序一共有两种方法,一种是自上而下的归并排序,一种是自下而上的归并排序
(1)自下而上的归并排序
所谓的自下而上排序分为三个步骤
1.分解:将待排序的数列分成若干个长度为1的子数列,然后将这些数列两两合并;
2.合并:得到若干个长度为2的有序数列,再将这些数列两两合并;