java中归并排序及Master公式是什么
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,java中归并排序及Master公式是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。基本思想归并排序采取分治的思想进行排序,借用
千家信息网最后更新 2025年02月01日java中归并排序及Master公式是什么
java中归并排序及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 static 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++]; }else { 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.sort(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公式是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。
排序
复杂
复杂度
数组
递归
公式
时间
问题
部分
生成
验证
有序
两个
个数
元素
对数
思想
情况
指针
方法
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
科技金融网络安全课题研究
网络安全专业研究生怎么样
趋势服务器版
小鸡服务器下载
mysql数据库软件教程
尘埃4服务器
dell 服务器h700安装
Dr620服务器
微信语音转文字是网络技术吗
access软件开发更新
我的世界服务器如何开启末地
深圳未来互联网络科技开发
数据库创建表怎么改数据类型
论坛系统数据库设计
个人电脑做代理服务器
osgi 数据库
泉州富盈宝网络技术有限公司
ospf数据库路由没加表
服务器板上电源
数据库原理与应用期末知识点
认证登录的公共网络安全吗
趋势服务器版
饿了吗数据库管理人员操作规范
沈阳新华互联网科技学校位置
公主连结三星服务器
管家婆客户端连接服务器
鲸鲨互联网科技有限公司
崇明区智能化软件开发优势
网络安全管理人员技能要求
单位网络安全应急预案