public static void merge(int[] array,int low,int mid,int high) { int s1 = low; int s2 = mid+1; int len = high-low+1; int[] ret = new int[len]; int i = 0; while (s1 <= mid && s2 <= high) { if(array[s1] <= array[s2]) { ret[i++] = array[s1++]; }else { ret[i++] = array[s2++]; } } while (s1 <= mid) { ret[i++] = array[s1++]; } while (s2 <= high) { ret[i++] = array[s2++]; } for (int j = 0; j < ret.length; j++) { array[j+low] = ret[j]; } } public static void mergeSortInternal(int[] array,int low,int high) { if(low >= high) { return; } int mid = (low+high)>>>1; mergeSortInternal(array,low,mid); mergeSortInternal(array,mid+1,high); merge(array,low,mid,high); }
原理:
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
时间复杂度 : O(n * log(n)) 数据不敏感
空间复杂度 : O(n) 数据不敏感
稳定性:稳定。