归并排序采取分治的思想进行排序,借用一张图片说明一下
将n个元素从中间切开,分成两部分。(左边可能比右边多1个数) 将步骤1分成的两部分,再分别进行递归分解。直到所有部分的元素个数都为1。 从最底层开始逐步合并两个排好序的数列。
优点在于,分治之后,合并排序的过程时间复杂度是o(n)(只需要扫描一遍就可以将两个有序的数组合并成一个有序数组)
public static void mergesort(int[] arr,int l , int r) { if (l == r || r < 0){ return; } int middle = l+(r-l)/2; //取中值,可以防止达到integer.maxvalue 溢出 mergesort(arr,l,middle); mergesort(arr,middle+1,r); sort(arr,l,middle,r); } /** * * @param arr 等待排序的数组 * @param l 左数组第一个指针 * @param middle 分割左右数组 * @param r 右数组最后一个指针 */ private s公会名tatic void sort(int[教师节写给老师的话] arr, int l, int middle, int r) { int[] temp = new int[arr.length]; system.arraycopy(arr, 0, temp, 0, arr.length); int right_first = middle+1; int tempindex = l; while (l <= middle && right_first <= r){ if (temp[tempindex] < temp[right_first]){ 全民党 arr[l++] = temp[tempindex++]; }el { arr[l++] = temp[right_first++]; } } while (tempindex <= middle){ arr[l++] = temp[tempindex++]; } while (right_first <= r ){ arr[l++] = temp[right_first++]; } }
我们可以写个对数器,使用暴力排序的方式验证我们的排序方法是否准确
//生成1-100内随机数组 public static int[] getparamarrays(){ int[] result = new int[(int) (math.random() * 100)]; //随分数线什么时候出来机生成数 for (int i = 0; i < result.length; i++) { result[i] = (int) (math.random() * 100); } return result; } public static void main(string[] args){ for (int i = 0; i < 1000000; i++) { int[] nums = getparamarrays(); int[] temp = nums; mergesort(nums,0,nums.length-1); arrays.s中国人失掉自信力了吗ort(temp); //通过自定义比较次数,对随机数组进行排序验证正确性 if (!nums.equals(temp)){ system.out.println("wrong"); } } system.out.println("end"); }
形如
t(n) = a * t(n/b) + o(n^d)(其中的a、b、d都是常数)
的递归函数,可以直接通过master公式来确定时间复杂度
如果 log(b,a) < d,复杂度为o(n^d)
如果 log(b,a) > d,复杂度为o(n^log(b,a))
如果 log(b,a) == d,复杂度为o(n^d * logn)
此公式适用于子递归规模相等的情况下
a表示递归的次数也就是生成的子问题数,b表示每次递归是原来的1/b之一个规模,o(n^d) 表示分解和合并所要花费的时间之和(除开递归的复杂度)
此处就是 t(n)= 2*t(n/2)+o(n^1) 适用于第三种情况 复杂度为 o(nlogn)
到此这篇关于java中归并排序和master公式详解的文章就介绍到这了,更多相关java归并排序和master公式内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 10:42:23,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/9f28359144c800573d18dcfad9316588.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:java中归并排序和Master公式详解.doc
本文 PDF 下载地址:java中归并排序和Master公式详解.pdf
留言与评论(共有 0 条评论) |