首页 > 作文

java中归并排序和Master公式详解

更新时间:2023-04-04 10:42:24 阅读: 评论:0

目录
基本思想实现对数器验证递归时间复杂度计算 master 公式总结

基本思想

归并排序采取分治的思想进行排序,借用一张图片说明一下

将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");    }

递归时间复杂度计算 master 公式

形如
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 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图