1. 1 原理
- 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。
- 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
- 若将两个有序表合并成一个有序表,称为二路归并。
1.2 归并原理图示(合并两个有序数组)

1.3 示例代码
1.3.1 合并两个有序数组
public void merge(int[] array,int lowIndex,int midIndex,int highIndex){
int size = highIndex-lowIndex;
int[] extraArray = new int[size];
int leftIndex = lowIndex;
int rightIndex = midIndex;
int extraIndex = 0;
while(leftIndex<midIndex&&rightIndex<highIndex){
if(array[leftIndex]<=array[rightIndex]){
extraArray[extraIndex++] = array[leftIndex++];
}else{
extraArray[extraIndex++] = array[rightIndex++];
}
}
if(leftIndex<midIndex){
while(leftIndex<midIndex){
extraArray[extraIndex++] = array[leftIndex++];
}
}else{
while(rightIndex<highIndex){
extraArray[extraIndex++] = array[rightIndex++];
}
}
for(int i=0;i<size;i++){
array[i+lowIndex] = extraArray[i];
}
}
1.3.2 归并排序实现
1.3.2.1 递归版本
public void mergeSortInternal(int[] array,int lowIndex,int highIndex){
int size = highIndex-lowIndex;
if(size<=1){
return;
}
int middIndex = (lowIndex+highIndex)/2;
mergeSortInternal(array,lowIndex,middIndex);
mergeSortInternal(array,middIndex,highIndex);
merge(array,lowIndex,middIndex,highIndex);
}
public void mergeSort(int[] array){
mergeSortInternal(array,0,array.length);
}
1.3.2.2 非递归版本
public void mergeSort(int[] array){
for(int i = 1;i<array.length;i=i*2){
for(int j =0;j<array.length;j=j+2*i){
int lowIndex = j;
int middIndex = j+i;
if(middIndex>=array.length){
continue;
}
int highIndex = middIndex+i;
if(highIndex>array.length){
highIndex = array.length;
}
merge(array,lowIndex,middIndex,highIndex);
}
}
}
1.3.3 运行结果

1.4 性能分析
- 时间复杂度:O(n*log(n))
- 空间复杂度:O(n)
- 稳定性:稳定