原理简述
归并排序的基本思想是分治,基本原理就是将原数组分为两部分,然后再将分开的数组在进行合并。
图解
代码
public class MergeSort { /** * 合并 * @param arr 排序数组 * @param start 开始索引 * @param m 中间位置索引 * @param end 结束索引 */ static void merge(int[] arr,int start,int m,int end){ //分别计算两个分组的长度 int n1 = m - start + 1; int n2 = end - m; //创建两个辅助数组 int[] L = new int[n1]; int[] R = new int[n2]; //将原数组的元素拷贝到辅助数组中 for (int i = 0; i < n1; i++) { L[i] = arr[start + i]; } for (int j = 0; j < n2; j++) { R[j] = arr[m+1+j]; } //遍历两个数组,当其中任意一个数组遍历完毕的时候停止循环 int i = 0,j = 0; int k = start; while (i<n1 && j<n2){ if (L[i]<=R[j]){ //当遍历到的左边数组元素小于等于遍历到右边的数组,原数组对应位置换为左边数组遍历到的值 arr[k] = L[i]; i++; }else { //当遍历到的左边数组元素大于遍历到右边的数组,原数组对应位置换为右边数组遍历到的值 arr[k] = R[j]; j++; } k++; } //将剩余的数组追加到原数组的尾部 while (i < n1){ arr[k] = L[i]; i++; k++; } while (j < n2){ arr[k] = R[j]; j++; k++; } } static void sort(int[] arr,int start,int end){ if (start < end){ //中间索引 int m = (start + end)/2; //递归前半部分数组 sort(arr, start, m); //递归后后半部分数组 sort(arr, m+1, end); //排序 merge(arr, start, m, end); } } public static void main(String[] args) { int[] arr = {2,5,7,9,3,6,7,3,1}; sort(arr, 0, arr.length-1); for (int i : arr) { System.out.print(i + " "); } } }
算法分析
- 时间复杂度:O(n log n)
- 空间复杂度:O(n)
- 稳定性:稳定
来源:https://www.cnblogs.com/erkye/p/12526536.html