学习的该篇博客,代码简单明了,推荐:图解排序算法(四)之归并排序
public class MergeSort {
public static void msa(int[] array){
int[] temp = new int[array.length];
divide(array,0,array.length-1,temp);
}
public static void divide(int[] array,int left,int right,int[] temp){
if (left == right){
return;
}
int mid = (left+right)/2;
divide(array,left,mid,temp);
divide(array,mid+1,right,temp);
merge(array,left,mid,right,temp);
}
public static void merge(int[] array,int left,int mid,int right,int[] temp){
int i = left;
int j = mid+1;
int t = 0;
while (i<=mid && j<=right){
if (array[i] < array[j]){
temp[t++] = array[i++];
}else{
temp[t++] = array[j++];
}
}
while (i<=mid){
temp[t++] = array[i++];
}
while (j<=right){
temp[t++] = array[j++];
}
t=0;
while(left <= right){
array[left++] = temp[t++];
}
}
public static void main(String[] args) {
int[] array = {3,4,6,1,7,5,2,34,98};
msa(array);
for (int i=0;i<array.length;i++){
System.out.println(array[i]);
}
}
}
实现流程:分而治之,先递归拆分为单个值,再在合并的过程中,将两个已经有序的数组进行合并,循环顺序比较大小,合并成为一个暂时的数组,再用该数组替换原有范围的数组
时间复杂度:O(n logn)
空间复杂度:O(n)
注意:在使用额外数组存储合并结果时,要在每次合并时把这些值赋值给原数组