归并排序(Merge Sort)是建立在归并操作上的一种有效的排序算法,它将已有序的子序列合并,得到完全有序的序列。
归并排序的速度仅次于快速排序,时间复杂度为O(n*logn),为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。
请看下述代码:
package 排序算法.归并排序;
import java.util.Arrays;
/**
* 归并排序
*/
public class Test {
static int num=0;//排序次数
//排序前,先建好一个长度等于原数组的临时数组,避免递归中频繁开辟栈空间
static void sort(int[] arr){
int[] temp=new int[arr.length];
sort(arr,0,arr.length-1,temp);
}
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);//将两个有序子数组合并操作
}
}
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];
t++;
i++;
}else{
temp[t]=arr[j];
t++;
j++;
}
}
while (i<=mid){//将左边剩余元素填充进temp中
temp[t]=arr[i];
t++;
i++;
}
while (j<=right){//将右序列剩余元素填充进temp中
temp[t]=arr[j];
t++;
j++;
}
t=0;
//将temp中的元素全部拷贝到原数组中
while (left<=right){
arr[left]=temp[t];
left++;
t++;
}
System.out.println("第"+(++num)+"次:"+ Arrays.toString(arr));
}
public static void main(String[] args) {
int[] arr=new int[]{15,32,14,86,54,78,36};
System.out.println("排序前:"+Arrays.toString(arr));
sort(arr);
System.out.println("排序后:"+Arrays.toString(arr));
}
}
上述代码的运行结果为:
排序前:[15, 32, 14, 86, 54, 78, 36] 第1次:[15, 32, 14, 86, 54, 78, 36] 第2次:[15, 32, 14, 86, 54, 78, 36] 第3次:[14, 15, 32, 86, 54, 78, 36] 第4次:[14, 15, 32, 86, 54, 78, 36] 第5次:[14, 15, 32, 86, 36, 54, 78] 第6次:[14, 15, 32, 36, 54, 78, 86] 排序后:[14, 15, 32, 36, 54, 78, 86]