分治法在排序算法中的应用(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),但是相比来说,归并排序在于其稳定性
分治法在排序算法中的应用(JAVA)--归并排序相关推荐
- 分治法在排序算法中的应用(JAVA)--快速排序(Lomuto划分、Hoare划分、随机化快排)
分治法在排序算法中的应用--快速排序 时间复杂度:平均O(nlogn),最坏O(n^2) 如果说归并排序是按照元素在数组中的位置划分的话,那么快速排序就是按照元素的值进行划分.划分方法由两种,本节将主 ...
- 减治法在排序算法中的应用(JAVA)--插入排序
一.减治法在排序算法中的应用 插入排序:时间复杂度O(n^2),虽然和选择.冒泡在最坏的情况下时间复杂度相同,但是插排平均性能在比自身的最差性能快一倍,所以相比选择.冒泡来说,插排要领先于二者. pu ...
- 用分治法设计一个算法,在数组A中寻找最大元素和最小元素 Java代码
算法分析与设计作业-- 用分治法设计一个算法,在数组A中寻找最大元素和最小元素 public class b1113 {static int min=Integer.MAX_VALUE;static ...
- 分治法在二叉树遍历中的应用(JAVA)--二叉查找树高度、前序遍历、中序遍历、后序遍
分治法在二叉树遍历中的应用 二叉树本身就是由两个更小的部分组成--左子树和右子树,所以二叉树的问题非常适合用分治法来解决. 二叉树的高度:从叶子到根之间的最长路径.我们可以理解为根的左子树高度和右子树 ...
- 减治法在查找算法中的应用(JAVA)--快速查找
减治法在查找算法中的应用 快速查找:选择问题是求一个n个数列表的第k个最小元素的问题,这个数k被称为顺序统计量.对于k=1或k=n来说,这并没有什么意义,我们通常会要找出这样的元素:该元素比列表中一半 ...
- 减治法在查找算法中的应用(JAVA)--折半查找
减治法在查找算法中的应用 折半查找:(时间复杂度O(log以2为底n的对数)) 对于有序数组的查找来说,折半查找是一种非常高效的算法,其基本原理为:比较查找键k和数组中间元素a[m],如果相等,算法结 ...
- 在遗传算法中出现等式约束_排序算法中的稳定性-等式的处理
在遗传算法中出现等式约束 by Onel Harrison 通过Onel Harrison 排序算法中的稳定性-等式的处理 (Stability in Sorting Algorithms - A T ...
- 排序算法中平均时间复杂度_操作系统中的作业排序(算法,时间复杂度和示例)...
排序算法中平均时间复杂度 作业排序 (Job sequencing) Job sequencing is the set of jobs, associated with the job i wher ...
- 蛮力法在排序算法中的应用(JAVA)--选择排序、冒泡排序
蛮力法在排序算法中的应用 对于一个排序问题,我们能想到的最简单的排序方法就是选择和冒泡 1.选择排序:时间复杂度O(n^2) public class Main {public static void ...
最新文章
- linux 下 将 shell script 与 一个桌面图标联系在一起 (2)
- linux无锁化编程--__sync_fetch_and_add系列原子操作函数
- CFBundleVersion与CFBundleShortVersionString
- ckeditor4 php,CKEditor 4自定义下拉列表
- php中args,PHP中的重载,即__call($name , $args)的使用
- HBuilder X全局文件搜索和文件字符搜索快捷键
- 反射java_Java反射原理
- 200t不稳定_技术革新!将不可能变为可能 这家企业是怎么做到的?
- 【计量经济学导论】08. 平稳时间序列
- usb网卡android驱动+win7,usb网卡万能驱动_手把手教你usb网卡驱动
- 2020计算机网络练习题记录(1)
- 银行新一代信息系统项目集群管理实践分享︱秦皇岛银行信息科技部总经理王登峰
- 谷歌图片的爬虫库(附加必应图片爬虫)--针对近期谷歌变了
- 台式机鼠标失灵打开计算机,台式电脑鼠标不动怎么办
- 游戏世界三维坐标转换为屏幕坐标原理分析:三角函数转换与矩阵变换
- 北理计算机学院毕设嗯开题报告,北理工德育论文开题报告(大学四年规划)
- 关于客户机服务器与微内核结构操作系统,第1章 操作系统概述1
- 集合—HashMap源码
- 创建不可删除的IE快捷方式图标
- (3)elasticsearch相关概念和索引的CURD
热门文章
- 启动wcc显示本地服务器失败,cwrsync server 服务启动失败的解决方法小结
- linux 目录定义,linux根目录定义
- In aggregated query without GROUP BY, expression #2 of SELECT list contains nonaggregated column...
- linux下mips裸机编译,裸机交叉编译器输入
- Redis的基础事务
- Java常见异常处理
- 家用使用计算机组装,不能再简单了!家用电脑DIY组装实操
- 以相关组为基础的3D物体识别
- php pdo 关闭,php pdo预处理
- python升级版本命令_如何在python中安装和配置kivy库