排序算法一归并排序
欢迎光临我的博客[http://poetize.cn],前端使用VUE2,聊天室使用VUE3,后台使用Spring Boot
复杂度
平均时间复杂度: O( n log n)
空间复杂度: O(n)
稳定性:稳定
基本思想
将一个整体的数组被分解成以数组中单一元素为基本单位的多区域集合,
此时,在每个单一区域中设置两个引用(左引用L与右引用R),利用两个引用,使得每个单一数组中的元素变为有序。
最后执行merge方法(融合),使得左右两边有序的两个单一区域进行合并,合并的过程是简单的递推过程。
1 public static void mergeSort(int[] arr, int begin, int end) { 2 int len = arr.length; 3 int mid = (begin + end) / 2; 4 if (begin < end) { 5 //分 6 mergeSort(arr, begin, mid);//左边有序 7 mergeSort(arr, mid + 1, end);//右边有序 8 //合 9 merge(arr, begin, mid, end); 10 } 11 } 12 13 private static void merge(int[] arr, int begin, int mid, int end) { 14 //临时数组,储存排序后的数组片段 15 int[] temp = new int[end - begin + 1]; 16 // i代表左边数组的第一个元素 17 // j代表右边数组的第一个元素 18 // k代表临时数组的角标 19 int i = begin, j = mid + 1, k = 0; 20 21 //将两个数组排序放入临时数组 22 while (i <= mid && j <= end) { 23 if (arr[i] < arr[j]) { 24 temp[k++] = arr[i++]; 25 } else { 26 temp[k++] = arr[j++]; 27 } 28 } 29 //如果左边为排完,右边排完 30 while (i <= mid) temp[k++] = arr[i++]; 31 //如果右边为排完,左边排完 32 while (j <= end) temp[k++] = arr[j++]; 33 for (int l = 0; l < temp.length; l++) { 34 arr[begin++] = temp[l]; 35 } 36 }