递归实现:
<span style="font-size:18px;"><span style="font-size:18px;">/**
* Created by wqh on 2016/10/7.
*/
public class merge_recusion {
public static void merge(int[] nums, int low, int mid, int high){
int[] temp=new int[high-low+1];
int i=low;
int j=mid+1;
int k=0;
while(i<=mid && j<=high) {
if (nums[i] > nums[j]) {
temp[k++] = nums[j++];
} else {
temp[k++] = nums[i++];
}
}
while(i<=mid){
temp[k++]=nums[i++];
}
while(j<=high){
temp[k++]=nums[j++];
}
for(int m=0; m<high-low+1; m++){
nums[low+m]=temp[m];
}
}
public static void sort(int[] array, int low, int high){
int mid = (low+high)/2;
if(low<high){
sort(array, low, mid);
sort(array, mid+1, high);
merge(array, low, mid, high);
}
}
public static void main(String[] args){
int[] array=new int[]{1,212,32,4,65,423,5,4,345,32,89};
sort(array,0,array.length-1);
for(int element:array){
System.out.print(element+" ");
}
}
}
</span></span>
非递归实现:
<span style="font-size:18px;"><span style="font-size:18px;">import com.sun.org.apache.bcel.internal.generic.ARRAYLENGTH;
import com.sun.scenario.effect.Merge;
/**
* Created by wqh on 2016/10/7.
*/
public class merge_Non_recursion {
//将两有序子数组进行重新排序
public static void merge(int[] nums, int low, int mid, int high){
int[] temp=new int[high-low+1];
int i=low;
int j=mid+1;
int k=0;
while(i<=mid && j<=high) {
if (nums[i] > nums[j]) {
temp[k++] = nums[j++];
} else {
temp[k++] = nums[i++];
}
}
while(i<=mid){
temp[k++]=nums[i++];
}
while(j<=high){
temp[k++]=nums[j++];
}
for(int m=0; m<high-low+1; m++){
nums[low+m]=temp[m];
}
}
//将间隔s的子数组两两归并
public static void MergePass(int[] array, int s, int len){
int i=0;
while(i<=len-2*s){
merge(array, i, i+s-1, i+2*s-1);
i+=2*s;
}
if(i<=len-s){
merge(array, i, i+s-1, len-1);
}
}
//子序列长度一次加倍
public static void Merge_NonRecursion(int[] array){
int k=1;
while(k<array.length){
MergePass(array,k,array.length);
k*=2;
}
}
public static void main(String[] args){
int[] array=new int[]{1,22,34,12,34,43,5423,68,9,65,423,5,3,4,335,56,45,4,5,7,43,98,4,345,32,89};
Merge_NonRecursion(array);
for(int element:array){
System.out.print(element+" ");
}
}
}
</span></span>
递归理解(虚拟栈、函数调用)和算法时间空间复杂度可参考牛人写的链接点击打开链接