复杂度分析
平均时间复杂度:O(nlogn)
最佳时间复杂度:O(n)
最差时间复杂度:O(nlogn)
空间复杂度:O(n)
简单来说:先拆分再合并,用不了链表所以选择了数组,有注释可供理解,具体代码如下:
import java.util.Scanner;
public class guibing {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("Input the size of the array");
int m=sc.nextInt();
System.out.println("Input "+m+" numbers");
int[] arr = new int[m];
for(int i=0;i<m;i++){
arr[i] = sc.nextInt();
}
sort(arr,1,m);
sc.close();
}
public static void sort(int[] arr,int size,int m){
int[] mid = new int[m];
for(int i=0;i<m;i+=size*2){
int x=i;
int y=x+size;
int c=i;//内部循环起始点//
int ymax=i+2*size;//右指针最大范围//
if(m-i<=size){//如果剩余部分小于size//
for(int j=i;j<m;j++){
mid[j]=arr[j];
}
break;
}else if(m-i<2*size){//如果剩余部分大于size,但小于两个size,即不够比较//
ymax=m;
}
for(int j=0;j<size*2-1;j++){
if(arr[x]-arr[y]>0){ //左边大,则右边index+1//
mid[c]=arr[y];
y+=1;
}else { //右边大,则左边index+1//
mid[c]=arr[x];
x+=1;
}
c+=1;
if(x==i+size){ //左边或者右边index到顶了,直接放入mid尾部//
for(int b=y;b<ymax;b++){
mid[c]=arr[b];
c+=1;
}
break;
}else if(y==ymax){
for(int b=x;b<i+size;b++){
mid[c]=arr[b];
c+=1;
}
break;
}
}
}
size=size*2;
if(size>=m){
System.out.println("Finish!The arr is:");
for(int i=0;i<m;i++){
arr[i]=mid[i];
System.out.print(arr[i]);
System.out.print(" ");
}
return;
}else{
sort(mid,size,m);//如果没有排序完,递归进行//
}
}
}