递归实现
private static void mergeSort(int[] array,int left,int right,int[] tmp){
if(right-left>1){
int mid=left+((right-left)>>1);
//左半部分[left,mid)
mergeSort(array,left,mid,tmp);
//右半部分[mid,right)
mergeSort(array,mid,right,tmp);
//归并
mergeData(array,left,mid,right,tmp);
//归并结束后,有序序列存储在tmp中,将tmp数组中的数据复制到array中
System.arraycopy(tmp,left,array,left,right-left);
}
}
public static void mergeSort(int[] array){
int[] tmp=new int[array.length];
mergeSort(array,0,array.length,tmp);
}
public static void mergeData(int[] array,int left,int mid,int right,int[] tmp){
int index=left;
int begin1=left,end1=mid;
int begin2=mid,end2=right;
while (begin1<end1&&begin2<end2){
if(array[begin1]<=array[begin2]){
tmp[index++]=array[begin1++];
}
else{
tmp[index++]=array[begin2++];
}
}
//如果第一个区间中还有数据
while (begin1<end1){
tmp[index++]=array[begin1++];
}
//如果第二个区间有数据
while (begin2<end2){
tmp[index++]=array[begin2++];
}
}
稳定性:稳定
时间复杂度:O(NlogN)
空间复杂度:O(N)
循环实现
public static void mergeSortNor(int[] array){
int[] tmp=new int[array.length];
int gap=1;
while (gap<array.length){
for(int i=0;i<array.length;i+=gap*2){
int left=i;
int mid=left+gap;
int right=mid+gap;
if(mid>array.length){
mid=array.length;
}
if(right>array.length){
right=array.length;
}
mergeData(array,left,mid,right,tmp);
}
System.arraycopy(tmp,0,array,0,array.length);
gap*=2;
}
}
public static void mergeData(int[] array,int left,int mid,int right,int[] tmp){
int index=left;
int begin1=left,end1=mid;
int begin2=mid,end2=right;
while (begin1<end1&&begin2<end2){
if(array[begin1]<=array[begin2]){
tmp[index++]=array[begin1++];
}
else{
tmp[index++]=array[begin2++];
}
}
//如果第一个区间中还有数据
while (begin1<end1){
tmp[index++]=array[begin1++];
}
//如果第二个区间有数据
while (begin2<end2){
tmp[index++]=array[begin2++];
}
}