基本原理
该算法是采用分治法,即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
图解:
稳定性:稳定的
时间复杂度: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); } } }