分治法在排序算法中的应用(JAVA)--归并排序

分治法最常用的就是将规模为n的实例划分成两个n规模为n/2的实例 。推广到一般的情况,我们可以将规模为n的实例划分为b个规模为n/b的实例。这样对于算法的运行时间存在递推式:T(n) = aT(n/b)+f(n),这个式子又被称为通用分治递推式。

我们假定递推式中的f(n)∈O(n^d),其中d>=0,那么:

所以,对于等分的T(n) = 2T(n/2) + 1,因为a=2,b=2,d=0,并且a > b^d

则T(n) = O(n);

上面这个式子就是用来求解递推式结果的。

 

归并排序:(时间复杂度O(nlogn))

对于一个需要排序的数组a[0 - n-1],先将数组一分为二a[0 - n/2-1]和a[n/2+1 - n],对子数组排序,之后合并为一个有序数组

 

import java.util.Arrays;public class Main {// 合并两个有序数组public static void merge(int[] a, int low, int mid, int high) {int[] temp = new int[high - low + 1];int i = low;// 左指针int j = mid + 1;// 右指针int k = 0;// 把较小的数先移到新数组中while (i <= mid && j <= high) {if (a[i] < a[j]) {temp[k++] = a[i++];} else {temp[k++] = a[j++];}}while (i <= mid) {temp[k++] = a[i++];}while (j <= high) {temp[k++] = a[j++];}// 把新数组中的数覆盖a数组for (int k2 = 0; k2 < temp.length; k2++) {a[k2 + low] = temp[k2];}}// 递归分解数组,当待排序的序列长度为1时,判定为有序public static void mergeSort(int[] a, int low, int high) {int mid = (low + high) / 2;if (low < high) {// 左边mergeSort(a, low, mid);// 右边mergeSort(a, mid + 1, high);// 左右归并merge(a, low, mid, high);System.out.println(Arrays.toString(a));}}public static void main(String[] args) {int[] a = {8, 3, 2, 9, 7, 1, 5, 4};mergeSort(a, 0, a.length - 1);System.out.println("排序结果:" + Arrays.toString(a));}
}


归并排序在最坏情况下的键值比较次数十分接近基于比较的排序算法在理论上能够达到的最少次数。

此外快速排序和堆排序的时间复杂度也是O(nlogn),但是相比来说,归并排序在于其稳定性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ant design Modal关闭时清除数据的解决方案

背景&#xff1a;modal组件关闭时不清除数据&#xff0c;原来输入的数据还存在 解决方案&#xff1a; 1、modal的api&#xff1a;destroyOnClose 2、手动控制modal的销毁 this.state {destroy:true //设一开始为不显示状态 }{this.state.isDestroy? : <Modal classNam…

分治法在排序算法中的应用(JAVA)--快速排序(Lomuto划分、Hoare划分、随机化快排)

分治法在排序算法中的应用--快速排序 时间复杂度&#xff1a;平均O(nlogn)&#xff0c;最坏O(n^2) 如果说归并排序是按照元素在数组中的位置划分的话&#xff0c;那么快速排序就是按照元素的值进行划分。划分方法由两种&#xff0c;本节将主要介绍Huare划分&#xff0c;这也是…

分治法在二叉树遍历中的应用(JAVA)--二叉查找树高度、前序遍历、中序遍历、后序遍

分治法在二叉树遍历中的应用 二叉树本身就是由两个更小的部分组成--左子树和右子树&#xff0c;所以二叉树的问题非常适合用分治法来解决。 二叉树的高度&#xff1a;从叶子到根之间的最长路径。我们可以理解为根的左子树高度和右子树高度加1&#xff08;加1代表根所在的层&a…

Excel中用REPT函数制作图表

本文从以下七个方面&#xff0c;阐述在Excel中用REPT函数制作图表&#xff1a; 一. 图形效果展示 二. REPT语法解释 三. REPT制作条形图 四. REPT制作漏斗图 五. REPT制作蝴蝶图 六. REPT制作柱状图 七. REPT制作甘特图 一. 图形效果展示 这些图表都是用REPT函数制作成的&#…

分治法在求解“最近对”问题中的应用(JAVA)

分治法在求解“最近对”问题中的应用 最近对问题在蛮力法中有过讲解&#xff0c;时间复杂度为O(n^2)&#xff0c;下面将会采用分治法讲解这类问题&#xff0c;时间复杂度会降到O(nlogn) 我们将笛卡尔平面上n>1个点构成的集合称为P。若2< n < 3时&#xff0c;我们1可…

【转】python的复制,深拷贝和浅拷贝的区别

在python中&#xff0c;对象赋值实际上是对象的引用。当创建一个对象&#xff0c;然后把它赋给另一个变量的时候&#xff0c;python并没有拷贝这个对象&#xff0c;而只是拷贝了这个对象的引用 一般有三种方法&#xff0c; alist[1,2,3,["a","b"]] &#x…

分治法在求解凸包问题中的应用(JAVA)--快包算法

分治法在求解凸包问题中的应用&#xff08;JAVA&#xff09; 之前写过一篇蛮力法在求解凸包问题中的应用&#xff08;JAVA&#xff09;还算简单易懂&#xff0c;没有基础的读者最好先去阅读以下。这里用分治法来求解凸包问题&#xff0c;由于这个算法和快速排序十分相似&#x…

django class类即视图类添加装饰器的几种方法

根据别人发布整理&#xff0c;个人爱好收集&#xff08;原文&#xff1a;https://blog.csdn.net/mydistance/article/details/83958655 &#xff09; 一、定义视图类 定义类视图&#xff0c;且类视图继承自View&#xff08;举例&#xff09; from django.views.generic import …

动态规划在求解硬币问题中的应用(JAVA)--币制最大化、找零问题、硬币收集问题

动态规划&#xff1a;这种算法思想多用来求解最优化问题&#xff0c;因此这里存在一个最优化法则&#xff0c;法则指出最优化问题任一实例的最优解&#xff0c;都是由其子实例的最优解构成的。一般来说&#xff0c;自底向上的动态规划更容易设计&#xff0c;但是带有记忆功能的…

使用网络TCP搭建一个简单文件下载器

说明&#xff1a;该篇博客是博主一字一码编写的&#xff0c;实属不易&#xff0c;请尊重原创&#xff0c;谢谢大家&#xff01; 目录 一丶项目介绍 二丶服务器Server 三丶测试TCP server服务器 四丶客户端Client 五丶测试客户端向服务器下载文件 一丶项目介绍 1.叙述 生活中大家…

动态规划在求解背包问题中的应用(JAVA)--回溯法、记忆化法

动态规划在求解背包问题中的应用 背包问题向来是动态规划的典型问题&#xff0c;给定n个重量为w1,w2,...,wn&#xff0c;价值为v1,v2,...,vn的物品和一个称重量为W的背包&#xff0c;求这些物品中最优价值的一个子集&#xff0c;且能够装到背包中。 之前用蛮力法做过背包问题蛮…

JS跨域问题

因为浏览器的同源策略&#xff0c;默认情况下&#xff0c;JavaScript在发送AJAX请求时&#xff0c;URL的域名必须和当前页面完全一致。 完全一致的意思是&#xff0c;域名要相同&#xff08;www.example.com和example.com不同&#xff09;&#xff0c;协议要相同&#xff08;ht…

svn 服务器的搭建以及客户端的使用

1、svn 服务器的搭建以及客户端的使用&#xff0c;安装见下面的博客 https://blog.csdn.net/zh123456zh789/article/details/80921179 说明&#xff1a;服务器只是用来存储数据&#xff0c;服务器上的数据可以通过客户端torisesvn进行操作。比如将自己的项目存到服务器&#xf…

动态规划在求解传递闭包问题中的应用(JAVA)--Warshell算法

动态规划在求解传递闭包问题中的应用&#xff1a; 传递闭包&#xff1a;对于n个顶点有向图来说&#xff0c;如果第i个顶点到第j个顶点之间存在一条有效的有向路径&#xff08;即长度大于0的路径&#xff09;&#xff0c;那么T(i, j) 1,否则T(i, j) 0。例如&#xff1a;求解传…

Centos 7 LVM xfs文件系统修复

情况1&#xff1a; [sda] Assuming drive cache: write through Internal error xfs XFS_WANT_CORRUPTED_GOTO at line 1662 of file fs/xfs/libxfs/xfs_alloc.c Caller xfs_free_extent0x130 [xfs] Internal error xfs_trans_cancel at line 990 of file fs/xfs/xfs_trans.c.C…

动态规划在求解全源最短路径中的应用(JAVA)--Floyd算法

参考图论算法&#xff08;二&#xff09;-最短路径的Dijkstra [ 单源 ] 和Floyd[ 多源 ] 解法&#xff08;JAVA &#xff09;这种算法也叫Floyd-Warshell算法&#xff0c;虽然和Warshell算法名字相近&#xff0c;算法思想也相近&#xff0c;但确实是两种算法。对于一个带权图&a…

录播图的分页使用进度条形式显示

本次我是使用的slick轮播图插件&#xff0c;其官网网址如下&#xff1a; http://kenwheeler.github.io/slick/&#xff0c;下面是轮播图中的代码&#xff0c;如果你不知道效果是什么样子&#xff0c;亦可以去看一下阿里云的官网&#xff1a;https://www.aliyun.com/?utm_conte…

贪婪算法在求解最小生成树中的应用(JAVA)--Prim算法

贪婪算法&#xff1a;通过一系列步骤来构造问题的解&#xff0c;每一步对目前构造的部分分解做一个拓展&#xff0c;直到获得问题的完整解为止,而算法的核心思想就在于&#xff0c;算法的每一步都必须满足以下条件&#xff1a;可行&#xff08;满足问题的约束条件&#xff09;、…

requirements.txt

在文件夹下 生成requirements.txt文件 pip freeze > requirements.txt 安装requirements.txt依赖 pip install -r requirements.txt转载于:https://www.cnblogs.com/z-x-y/p/10420853.html

贪婪算法在求解最小生成树中的应用(JAVA)--Kruskal算法

Kruskal算法又被称为“加边法”&#xff0c;这种算法会将加权连通图的最小生成树看成具有V-1条边的无环子图&#xff0c;且边的权重和最小。算法开始时&#xff0c;会按照权重的非递减顺序对图中的边排序&#xff0c;之后迭代的以贪婪的方式添加边。 下面以下图为例来讲解Krusk…