1、算法思想:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分:问题分成一些小的问题然后递归求解,治:的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。将序列递归拆半分成多个子序列,再将各个子序列排序后归并叠加,最后归并所有子序列,排序完成。
2、算法过程
举个栗子(第一趟的排序过程)
原始序列:49、38、65、97、76、13、27
1)将原始序列看成7个只含一个元素的子序列,此时序列都是有序的
子序列1:49
子序列2:38
子序列3:65
子序列4:97
子序列5:76
子序列6:13
子序列7:27
2)两两归并,形成若干有序二元组,序列1和序列2归并,序列3和序列4归并......
结果:{38、49、}{65、97、}{13、76、}{27}
3)将这个序列看成若干二元组子序列
子序列1:38 49
子序列2:65 97
子序列3:13 76
子序列4:27
4)两两归并,形成若干有序四元组
结果:{38、49、65、97、}{13、27、76}
5)最后仅有两个子序列再次两两归并,完成最终排序
结果:{13、27、38、49、65、76、97}
public class MergeSort {
public static void main(String []args){
int []arr = {9,8,7,6,5,4,3,2,1};
sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int []arr){
int []temp = new int[arr.length];//在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间
sort(arr,0,arr.length-1,temp);
}
private static void sort(int[] arr,int left,int right,int []temp){
if(left<right){
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中
temp[t++] = arr[i++];
}
while(j<=right){//将右序列剩余元素填充进temp中
temp[t++] = arr[j++];
}
t = 0;
//将temp中的元素全部拷贝到原数组中
while(left <= right){
arr[left++] = temp[t++];
}
}
}