看了网上的许多博客,然后自己总结了下,谢谢大神们的贡献
public class MergeSort { public void sort(int[] arr, int lo, int hi) { if (lo >= hi) return; int mid = lo + (hi - lo)/2; sort(arr, lo, mid); sort(arr, mid+1,hi); merge(arr,lo,mid,hi); } public void merge(int[] a, int lo, int mid, int hi) { //临时数组,用来排放合并后的数组 int[] tmp = new int[hi-lo+1]; //前半段的指针,前半段a[lo ... mid] int i = lo; //后半段指针,后半段a[mid+1 ... hi] int j = mid+1; //tmp 指针 int k = 0; //前半段后半段做比较,较小的值放在临时数组,然后指针+1 while (i<=mid && j<=hi) tmp[k++] = a[i] < a[j] ? a[i++] : a[j++];
//因为上面是与操作,所以任意其中一个条件不满足就会跳出循环,而此时数组可能没放满,因此下面两个while用来填数组 //这两个while是互斥的,只能进其中一个 while (i<=mid) tmp[k++]=a[i++]; while (j<=hi) tmp[k++]=a[j++]; //这里的判断条件一定是小于k,因为再放完最后一个数后,由于k++,所以k又自增1,如果取t<=k,会引发索引越界 //这步的作用就是将临时数组的值放回原数组,因为是递归调用,所以要记得加上左边界lo for (int t=0;t<k;t++) a[lo+t] = tmp[t]; } public static void main(String[] args) { int[] a = {-523,645,34,2,8567,1,234,-534,12,678,-34,43,7,-5867,-56,23,0,4,-1234,6,867,56,3,0,5,-3,654,78,54,53,2}; //最终测试 new MergeSort().sort(a,0,a.length-1); System.out.println(Arrays.toString(a)); } }