常用排序算法-归并排序
简介
归并排序算法是基于归并操作的一种有效排序算法,是采用分治法的典型应用。归并排序算法将待排序序列分为若干个子序列,先对每个子序列进行排序,等每个子序列都有序后,再将有序子序列合并为整体的有序序列,若将两个有序表合并为一个有序表,则称之为二路归并。
原理
归并排序的原理是将原始数组分解为多个子序列,然后对每个子序列进行排序,最后将排好序的子序列合并起来。
程序
public class MergeSort { public static void sort(int[] arr){ mergeSort(arr, 0, arr.length - 1); } private static void mergeSort(int[] arr, int left, int right){ if(left >= right) return; int mid = left + (right - left) / 2; mergeSort(arr, left, mid); mergeSort(arr, mid+1, right); merge(arr, left, mid, right); } private static void merge(int[] arr, int left, int mid, int right){ int[] tempArr = new int[right-left+1]; int index = 0; int l = left, r = mid+1; while(l <= mid && r <= right){ if(arr[l] <= arr[r]) tempArr[index++] = arr[l++]; else tempArr[index++] = arr[r++]; } while(l <= mid) tempArr[index++] = arr[l++]; while(r <= right) tempArr[index++] = arr[r++]; for(int i = 0; i < tempArr.length; ++i) arr[left+i] = tempArr[i]; } }
总结
归并排序的时间复杂度最差为O(nlogn),最好情况时O(nlogn),平均时间复杂度为O(nlogn)。
归并排序空间复杂度O(n),因为需要临时数组保存合并的结果。
在序列合并的过程中,如果两个当前元素相等时,我们把处在前面的序列的元素保存在结果序列的前面,所以,归并排序也是稳定的。