核心思想:采用分治算法,“分”可以用递归实现,重点是“治”的过程,即合并的过程。
代码重点:
- 传入的参数中不仅需要原数组,还需要一个临时数组,来保存合并的结果。
- 方法传入形参中需要左右边界和中位数索引。
- 定义两个变量,一个指向左半数组的左边界,一个指向右半数组的左边界(即mid+1处)。
- 还需要定义一个临时变量,当做临时数组的索引指针。
- 将左右两半数组中的元素按照从小到大的顺序,依次放入临时数组中。需要注意的是,因为使用了while循环,条件中取得是左右两边界的并集,所以可能有半边数组还有元素没放入临时数组,需要将剩余元素放入。
- 将临时数组中的元素覆盖原数组元素。从左边界起!
import java.util.Arrays;
public class MergeSort {
private static void sort(int[] arr,int left,int right,int[] temp){
if(left>=right) return;
int mid=(left+right)/2;
sort(arr,left,mid,temp);
sort(arr,mid+1,right,temp);
merge(arr,left,mid,right,temp);
}
private static void merge(int[] arr,int left,int mid,int right,int[] temp){
int i=left;
int j=mid+1;
int t=0;
while(i<=mid&&j<=right){
if(arr[i]<arr[j]){
temp[t++]=arr[i++];
}else{
temp[t++]=arr[j++];
}
}
while(i<=mid){
temp[t++]=arr[i++];
}
while(j<=right){
temp[t++]=arr[j++];
}
t=0;
while(left<=right){
arr[left++]=temp[t++];
}
}
public static void main(String args[]){
int[] arr=new int[]{9,8,7,6,5,4,3,2,1};
int[] temp=new int[arr.length];
sort(arr,0,arr.length-1,temp);
System.out.println(Arrays.toString(arr));
}
}