private void MergeSort(int[] a, int left,int right){
if (left < right){
int middle = (left+right)/2; //取中间位置
MergeSort(a,left,middle); //递归,直到被分解到的子数组中只有一个元素,返回。
MergeSort(a,middle+1,right);//递归,直到被分解到的子数组中只有一个元素,返回。
Merge(a,left,middle,right); //对两个子数组进行排序
}
}
private void Merge(int[] a,int left,int middle,int right){
int[] b = new int[(right-left)+1];
System.arraycopy(a, left, b, 0, (right-left) +1);
int ls = left - left;
int m = middle - left;
int rs = (middle + 1) - left;
/*
* 通过临时数组b对数组a中从left 到 right 的元素进行排序
*/
for (int i=left;i<=right;i++){
if (b[ls] <= b[rs]){
a[i] = b[ls];
ls++;
if (ls > m){
System.arraycopy(b, rs, a, i+1, b.length - rs - 1);
break;
}
}else{
a[i] = b[rs];
rs++;
if (rs >= b.length){
System.arraycopy(b, ls, a, i+1, m - ls + 1);
break;
}
}
}
}
注意点: 这里参数中传递的int 型数组实际传递的是数组的引用。所以在每个递归过程中数组内容一直保持更新,无需以参数的形式进行返回。
附带 Java可运行实例