归并排序 图解

网友投稿 793 2022-11-19

归并排序 图解

归并排序 图解

图示过程

(1) 归并排序的流程

(2) 合并两个有序数组的流程

动图展示

Java代码实现

public static void mergeSort(int[] arr) { sort(arr, 0, arr.length - 1);}public static void sort(int[] arr, int L, int R) { if(L == R) { return; } int mid = L + ((R - L) >> 1); sort(arr, L, mid); sort(arr, mid + 1, R); merge(arr, L, mid, R);}public static void merge(int[] arr, int L, int mid, int R) { int[] temp = new int[R - L + 1]; int i = 0; int p1 = L; int p2 = mid + 1; // 比较左右两部分的元素,哪个小,把那个元素填入temp中 while(p1 <= mid && p2 <= R) { temp[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++]; } // 上面的循环退出后,把剩余的元素依次填入到temp中 // 以下两个while只有一个会执行 while(p1 <= mid) { temp[i++] = arr[p1++]; } while(p2 <= R) { temp[i++] = arr[p2++]; } // 把最终的排序的结果复制给原数组 for(i = 0; i < temp.length; i++) { arr[L + i] = temp[i]; }}

复杂度

时间复杂度:​​O(nlogn)​​​ 空间复杂度:​​O(N)​​,归并排序需要一个与原数组相同长度的数组做辅助来排序 稳定性:归并排序是稳定的排序算法,​​temp[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];​​这行代码可以保证当左右两部分的值相等的时候,先复制左边的值,这样可以保证值相等的时候两个元素的相对位置不变。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:jmeter基本使用小结
下一篇:[LeetCode] Binary Tree Paths 二叉树路径
相关文章

 发表评论

暂时没有评论,来抢沙发吧~