分治法:

1、思想:①将问题的实例划分为同一个问题的几个较小的实例,最好拥有相同的规模;②对于较小的实例进行求解,一般使用递归法,在问题规模足够小的情况下也是用另一个算法;③如果必要的话,合并这些较小问题的解

2、通用分治递推式:T(n) = a*T(n/b) + f(n); 其中,T(n)是指运算次数

3、主定律:上式中的f(n)是属于Θ(nd),d≥0,则:

当a<bd时,T(n)属于Θ(nd);

当a=bd时,T(n)属于Θ(n* log n);

当a>bd时,T(n)属于Θ(nlogba)


合并排序

一、步骤

a.  1、输入一个可排序数组arr,如果其规模大于1,则将其分为两个规模基本相同的子数组_arr1,_arr2

   2、对子数组分别重新调用本函数

   3、递归调用完毕后,调用b方法,对有序数组进行合并

b. 1、输入为两个有序数组arr1,arr2以及一个存储容器arr3

  2、对arr1 arr2内的元素进行比对,小的赋值给arr3,并将大的与下一个比较

3、若其中有一个比较完毕,则将另外一个剩下的数字依次赋值到数组尾部

二、JavaScript代码实现

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>合并排序法</title>
</head>
<body></body>
<script type="text/javascript">var mergesort = function(arr) {var n = arr.length;if (n > 1) {//将数组平均分为两个子数组var _arr1 = arr.slice(0, Math.floor(n/2));    var _arr2 = arr.slice(Math.ceil(n/2), n);//对子数组重新调用本方法
            mergesort(_arr1);mergesort(_arr2);//实现两个有序数组的合并
            merge(_arr1, _arr2, arr);//返回排过序的结果return arr;}else{return arr;}}/*** 实现对两个有序数组的合并* @param  {Array} arr1 有序数组* @param  {Array} arr2 有序数组* @param  {Array} arr3 * @return {[Array]}     [arr1与arr2两者合并后的顺序数组]*/function merge(arr1, arr2, arr3) {var i = 0, j = 0, k = 0, p = arr1.length, q = arr2.length;//当两个数组的元素依次比对,小的元素赋值给arr3while(i < p && j < q){if(arr1[i] < arr2[j]){arr3[k] = arr1[i];i++;}else{arr3[k] = arr2[j];j++;}k++;}//肯定是一个数组比对完毕,另一个数组未完全用完,因此该数组剩下的数字添加到arr3中if (i == p ) {    //如果arr2未处理完for(;j < q; j++){arr3[k] = arr2[j];k++;}} else {        //如果arr1未处理完for(;i < p; i++){arr3[k] = arr1[i];k++;}}};console.log(mergesort([8,3,2,9,7,1,5,4]));
</script>
</html>

三、算法分析

若输入规模是2的乘方,则键值的比较次数C(n) = 2C(n/2) + Cmerge(n), C(1) = 0;其中Cmerge(n)是合并阶段的键值比较次数。

最差的情况下,Cmerge(n) = n - 1;此时,C(n) = 2C(n/2) + n - 1;因此根据主定律C(n)属于Θ(n logn);  Cworst = nlog2n - n + 1

转载于:https://www.cnblogs.com/likaopu/p/5686219.html

关于算法--分治法--合并排序相关推荐

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

    分治法在排序算法中的应用--快速排序 时间复杂度:平均O(nlogn),最坏O(n^2) 如果说归并排序是按照元素在数组中的位置划分的话,那么快速排序就是按照元素的值进行划分.划分方法由两种,本节将主 ...

  2. 一步一步写算法(之合并排序)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面一篇博客提到的快速排序是排序算法中的一种经典算法.和快速排序一样,合并排序是另外一种经常使 ...

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

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

  4. 算法导论-排序算法-分治法

    1.分治法原理 所谓的分治指的就是分而治之,即将大规模的问题分解成几个较小规模的问题.通过对较小规模问题的求解达到对整个问题的的求解.当我们将问题分解成两个较小问题求解时的分治方法就是二分法. 分支的 ...

  5. 算法--分治法归并排序 python

    设计算法 我们可以选择使用的算法设计方法有很多,插入排序使用了增量方法:在排序子数组A[1-j-1]后,将单个元素A[ j ]插入子数组的适当位置,产生排序好的子数组A[1-j]. 而这次我们将考查另 ...

  6. C#内功修炼(算法)——分治法(一)

    分治法(递归的解决问题) 分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这 ...

  7. 五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法

    (1) 分治法 将一个难以直接解决的大问题,分割成一些规模较小的相同问题 快速排序 快排也是分治的一个实例,快排每一趟会选定一个数,将比这个数小的放左面,比这个数大的放右面, 然后递归分治求解两个子区 ...

  8. 跟我一起学算法——分治法

    目录 1.定义 2.适用条件分析 3.步骤 应用1:归并排序 步骤 算法 算法分析 应用2:快速排序 基本思想 算法 算法分析 参考 @ 分治法(Divide and Conquer) 1.定义 对于 ...

  9. java 数据合并算法_Java与算法之(11) - 合并排序

    天下事,合久必分,分久必合.合并排序的基本思想正是先分再合. 例如对3, 1这个数列排序,首先是分,分为3和1两个数列,然后再合并并排序.合并需要额外的辅助空间,即建立一个两个数列长度之和的空数组用于 ...

最新文章

  1. ue4商城素材 Cyberpunk City / Recife Environment 赛博朋克城市场景
  2. “智慧城市”方便百姓生活服务企业发展
  3. linux shell脚本中调用另一个shell脚本
  4. u盘插在linux电脑上没有反应,U盘插在自己电脑上没有反应,别人电脑有反应的解决方法...
  5. 什么?你的电商网页不够时尚?看这里
  6. 【BZOJ5005】乒乓游戏 [线段树][并查集]
  7. 回溯法 - 递归 - n皇后问题 - 所有解
  8. thinkphp使用163/126邮箱发送
  9. 已知某网络有一个地址是167.199.170.82/27,问这个网络的网络掩码。
  10. 【转】DICOM医学图像处理:浅析SWF、MWL、SPS、MPPS
  11. apache的IO包中的FileUtils方法的使用
  12. 中山计算机专硕不用发sci,最新!专硕发84篇SCI遭质疑,本人回应了
  13. Neural Network Intelligence (NNI) | 自动特征工程AutoFE示例程序
  14. ENFI下载器地址——百度网盘不限速下载工具
  15. openlayers摸爬滚打 5.openlayers使用GeoJSON绘制点、线
  16. 深度学习激活函数总结(sigmoid,tanh,ReLU,Leaky ReLU,EReLU,PReLU,Softmax,Swish,Maxout,Softplus)
  17. 无人机倾斜摄影和三维实景模型 实施流程
  18. 浪涌电流——原因、影响、保护电路和设计技术
  19. webpack打包全流程
  20. 几个html+css常用表格

热门文章

  1. 蒙特利尔大学助理教授唐建《图表示学习:算法与应用》研究进展
  2. 《Python编程从入门到实践》记录之类存储在模块及其导入
  3. 计算机双证学的是什么,​计算机在职研究生双证有些什么学校?怎么考?
  4. Python 圈精选文章
  5. 葡萄酒java_基于jsp的红酒网站-JavaEE实现红酒网站 - java项目源码
  6. php字符串函数的运用,php中字符串比较函数使用方法
  7. 英语c开头语言,字母c开头的英语短语
  8. oenwrt 进不了bios_为什么进不bios_进不了bios怎么解决?
  9. Win11正式发布新功能
  10. java 海量文件存储_【直通BAT】海量数据面试总结