<span style="font-family: Arial, Helvetica, sans-serif;">public class MergeSort {</span>
public int[] mergeSort(int[] A, int n) {
sort(A,0,n-1);
return A;
}
public void sort(int[] data,int left,int right){
if(left<right){
int middle=(left+right)/2;
//划分左右
sort(data,left,middle);
sort(data,middle+1,right);
//合并左右
merge(data,left,middle,right);
}
}
//合并左右两个子数组
public void merge(int[] data,int left,int middle,int right){
//临时数组
int[] tempArr=new int[right-left+1];//空间复杂度O(N)
//左边数组游标
int leftIndex=left;
//右边数据游标
int rightIndex=middle+1;
//临时数组游标
int tempIndex=0;
while(leftIndex<=middle&&rightIndex<=right){
//临时数组选取左、右子数组中小数值
if(data[leftIndex]<data[rightIndex]){
tempArr[tempIndex++]=data[leftIndex++];//如果左小,则插入临时数组,并用左边下一个和右边比较
}else{
tempArr[tempIndex++]=data[rightIndex++];
}
}
//剩余的直接放入
while(leftIndex<=middle){
tempArr[tempIndex++]=data[leftIndex++];
}
//剩余的直接放入
while(rightIndex<=right){
tempArr[tempIndex++]=data[rightIndex++];
}
//将临时数组放回原数组相应位置
int temp=0;
while((temp+left)<=right){
data[left+temp]=tempArr[temp];
temp++;
}
}
}
归并排序先让数组变成每个长度为一的有序空间,再两两合并成长度为二的有序区间,然后是长度为四的有序区间,直到合并成一个完整的有序区间,这种叫做二路归并排序。其核心就是将前后两个有序的数组合并为一个有序数组,其时间复杂度为O(nlogn),空间复杂度为O(N)。再性能上算是一种比较快的排序