归并排序的基础归并算法
将两个有序的数组归并成一个更大的有序数组。根据这个操作发明了一种简单的递归排序算法:归并排序。要将一个数组排序,可以先(递归地)将它分成两半分别排序。
今天,我们先实现这个算法的最基础部分,就是把一个数组的两个已排好序的部分合并,方法名为merge 参数有a为数组int [],lo,mid,hi,通过这个方法将a[lo,mid]和a[mid+1,hi]合并到a[lo,hi]中
我们可以这样:
初始化两个指针i=lo, j=mid+1。
然后for循环从0到temp数组的长度-1,在循环体内:
如果左子数组已经全部合并(i>mid),那么当前元素取右子数组的j位置,j++。
如果右子数组已经全部合并(j>hi),那么当前元素取左子数组的i位置,i++。
如果都没有,则比较a[i]和a[j],将较小的放入数组,并移动相应的指针。
具体处理过程可以先复制数组至临时数组,再比对放入目标数组中;也可以把处理结果方入临时数组,最后再复制进目标数组,时间和空间没有区别。下面按第一种设想处理,详见代码
public class MergeSort {public static void merge(int [] ints,int lo,int mid,int hi){int i = lo;int j = mid + 1;//先复制int [] temp = new int[ints.length];for(int k = lo;k <= hi;k++){temp[k] = ints[k];}//再处理for (int k = lo; k <= hi; k++) {if (i > mid) {// 左子数组已全部处理完,直接复制右子数组ints[k] = temp[j++];} else if (j > hi) {// 右子数组已全部处理完,直接复制左子数组ints[k] = temp[i++];} else if (temp[i] <= temp[j]) {// 左子数组元素较小或相等ints[k] = temp[i++];} else {// 右子数组元素较小ints[k] = temp[j++];}}}public static void main(String [] args){int [] a = {1,3,5,2,4,6};merge(a,0,2,5);for(int outprint : a){System.out.print(outprint + " ");}}
}
