package com.duoduo.day316;
/**
* 合并排序
* 分解 ----治理----合并
* @author 多多
*
*/
import java.util.Scanner;
public class MergeSort {
public static void main(String [] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入数列中的元素个数:");
int n=sc.nextInt();
int [] arr=new int[n];
System.out.println("请依次输入数列中的元素:");
for(int i=0;i<n;i++) {
arr[i]=sc.nextInt();
}
mergeSort(arr,0,n-1); //分解
System.out.println("合并排序结果:");
for(int i=0;i<n;i++) {
System.out.print(arr[i]+" ");
}
}
/*合并两个子序列*/
public static void merge(int [] arr,int low, int middle,int high) {
int [] B=new int[high-low+1]; //建立辅助数组 存放排序后的数组元素
int i = low; //i从low 开始,不一定是0
int j=middle+1;
int k=0; //定义指向两个子序列和辅助数组的指针
while(i<=middle && j<=high) { //分别指向两个子序列
if(arr[i]<=arr[j]) { //比较当前指向元素的大小,将小值存放在B中兵依次移动对应指针
B[k++]=arr[i++];
}else {
B[k++]=arr[j++];
}
} //当有一个子序列元素存放完毕后 将另一子序列元素按序存入B中
while(i<=middle) B[k++]=arr[i++];
while(j<=high) B[k++]=arr[j++];
//B数组存放排好序的所有元素 将其内容复制给原arr数组
for(i=low,k=0;i<=high;i++)
arr[i]=B[k++];
}
/*递归形式的合并排序算法*/
public static void mergeSort(int [] arr, int low,int high) {
if(low<high) {
int middle=low+((high-low)>>1);
mergeSort(arr,low,middle); //分解成两个子序列 并分别合并排序
mergeSort(arr,middle+1,high);
merge(arr,low,middle,high); //将两个子序列合并起来
}
}
}
时间复杂度:
分解 O(1)
解决子问题:递归2T(n/2)
合并O(n)
总:T(n)=2T(n/2)+O(n)------O(nlogn)
空间复杂度:
辅助数组 O(n)
递归调用栈空间 (即递归树的深度)O(logn)