归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
最佳情况:T(n) = O(n) 最差情况:T(n) = O(nlogn) 平均情况:T(n) = O(nlogn)
2-路归并的具体解析:
1)将序列分成左右子序列
2)再将左右子序列分成左右子序列,直至分成子序列都小于2
3)将左右子序列进行排序后归并到一起在进行归并排序
补充:需要额外的空间
package sort; /** * @author wyc * 归并排序 * 思路:先递归分解,然后在底层合并 */ public class MergeSort { public static void main(String[] args) { int[] arrays = {1,11,12,4,2,6,9,0,3,7,8,2}; mergeSort(arrays); for(int value : arrays){ System.out.print(value+","); } } private static void mergeSort(int[] array) { if(array == null && array.length == 0){ return; } int[] temp = new int[array.length]; mergeSort(array, 0, array.length-1, temp); } private static void mergeSort(int array[], int first, int last, int temp[]) { if(first < last){ int mid = (first + last) / 2; mergeSort(array, first, mid, temp); mergeSort(array, mid+1, last, temp); mergeArray(array, first, mid, last, temp); } } /** * 合并两个有序数列 * array[first]~array[mid]为第一组 * array[mid+1]~array[last]为第二组 * temp[]为存放两组比较结果的临时数组 */ private static void mergeArray(int array[], int first, int mid, int last, int temp[]) { int i = first, j = mid + 1; // i为第一组的起点, j为第二组的起点 int m = mid, n = last; // m为第一组的终点, n为第二组的终点 int k = 0; // k用于指向temp数组当前放到哪个位置 while (i <= m && j <= n) { // 将两个有序序列循环比较, 填入数组temp if (array[i] <= array[j]) temp[k++] = array[i++]; else temp[k++] = array[j++]; } while (i <= m) { // 如果比较完毕, 第一组还有数剩下, 则全部填入temp temp[k++] = array[i++]; } while (j <= n) {// 如果比较完毕, 第二组还有数剩下, 则全部填入temp temp[k++] = array[j++]; } for (i = 0; i < k; i++) {// 将排好序的数填回到array数组的对应位置 array[first + i] = temp[i]; } } }