基本原理
该算法是采用分治法,即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
图解:

稳定性:稳定的
时间复杂度:O(nlogn)
其他:
若从空间复杂度来考虑:首选堆排序,其次是快速排序,最后是归并排序。
若从稳定性来考虑,选择归并排序,堆排序和快速排序都不稳定。
若从平均情况下的排序速度考虑,应该选择快速排序。
public class MergeSort {
public void mergeSort(int[] a, int left, int right) {
if (left < right) {
int middle = (left + right) / 2;
mergeSort(a, left, middle);
mergeSort(a, middle + 1, right);
merge(a, left, middle, right);// 合并
}
}
private void merge(int[] a, int left, int middle, int right) {
int[] tmpArray = new int[a.length];
int rightStart = middle + 1;
int tmp = left;
int third = left; // 表示下标++
// 比较两个小数组相应下标位置的数组大小,小的先放进新数组
while (left <= middle && rightStart <= right) {
if (a[left] <= a[rightStart]) {
tmpArray[third++] = a[left++];
} else {
tmpArray[third++] = a[rightStart++];
}
}
// 如果左边还有数据需要拷贝,把左边数组剩下的拷贝到新数组
while (left <= middle) {
tmpArray[third++] = a[left++];
}
// 如果右边还有数据......
while (rightStart <= right) {
tmpArray[third++] = a[rightStart++];
}
//将数据拷贝到原来的数组中
while (tmp <= right) {
a[tmp] = tmpArray[tmp++];
}
}
public static void main(String[] args) {
MergeSort mergeSort = new MergeSort();
int[] a = new int[] { 3,5,1,6,4 };
mergeSort.mergeSort(a, 0, a.length - 1);
for (int n : a) {
System.out.print(" " + n);
}
}
}