归并排序(Java)
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
- 时间复杂度:O(nlog 2 n)
- 稳定性:稳定
- 实质:将两个或两个以上的序列组合成一个新的有序表
图示
(图片来自:https://www.cnblogs.com/guoyaohua/p/8600214.html)
代码如下
public class Mergesort {
public static void main(String[] arrrgs) {
int []arr= {49,38,65,97,76,13,27,49,55,4};
mergeSort(arr,0,arr.length-1);
System.out.print("归并排序的结果为:");
for(int i=0;i<arr.length;i++) {//简写:for(int i:arr)
System.out.print(arr[i]+" ");
}
}
public static void mergeSort(int[] arr,int p,int r) {
if (p < r){
int q =(int)Math.floor((p+r)/2);
mergeSort(arr,p,q); //将左半边排序
mergeSort(arr,q+1,r); //将右半边排序
Merge(arr,p,q,r); //归并结果
}
}
public static void Merge(int[] arr,int p,int q,int r){
int n1 = q - p + 1;
int n2 = r - q;
int[] L = new int[n1 + 1];//L[1..n1+1], R[1..n2+1]是新的数组
int[] R = new int[n2 + 1];
for (int i = 0;i < n1;i++){
L[i] = arr[p + i];
}
for (int j = 0;j < n2;j++){
R[j] = arr[q + j + 1];
}
L[n1] = Integer.MAX_VALUE;
R[n2] = Integer.MAX_VALUE;
int i = 0,j = 0;
for (int k = p;k <= r;k++){
if (L[i] <= R[j]){
arr[k] = L[i];
i = i + 1;
}else{
arr[k] = R[j];
j = j + 1;
}
}
}
}
运行结果
归并排序的结果为:4 13 27 38 49 49 55 65 76 97