• 递归排序的两种实现

<script type="text/javascript">
//归并排序(递归实现)
//思想:堆排序利用了完全二叉树的性质,但是比较麻烦
//而归并排序则是直接利用构造一颗完全二叉树
//实现策略:先对数据分组,分到只有一个元素是:拷贝数组的元素到本次函数的
//SR数组中,归并SR到arr2中,arr2指向上层函数的SR数组
//时间复杂度:归并的次数是完全二叉树的高度,同时每次都需要对两个序列
//进行排序O(n),所以总的时间复杂度为O(nlogn)
//空间复杂度O(n+logn) n是数组 logn是递归需要的空间
//稳定性:稳定
function MergingSort(obj)
{
    MSort(obj.data,obj.data,1,obj.length);
}
//拆分序列
//下层的数据SR归并到arr2中,arr2中本层函数的SR
function MSort(arr1,arr2,s,t)
{

     var m;
    var SR=[];
    //SR用来存放下层函数归并的数据
    if(s==t)
        arr2[s]=arr1[s];
    else
    {
        m=Math.floor((s+t)/2);
        MSort(arr1,SR,s,m);
        MSort(arr1,SR,m+1,t);
        //console.log(SR);
        //打印归并的过程
        Merge(arr2,SR,s,m,t);
        //console.log(arr2);
        //打印归并的过程
    }

}
//归并排序的非递归实现
//时间复杂度:O(nlogn)
//空间复杂度:O(n)
//稳定性:稳定
function MergingSort1(obj)
{
    var k=1;
    //k代表每次归并的序列长度
    var arr1=[];
    while(k<obj.length)
    {
      //执行两次是为了把数据放放到元素中
      //归并arr中的数据到arr1
      MergePass(obj.data,arr1,k,obj.length);
      k=2*k;
      //归并arr1到arr
      MergePass(arr1,obj.data,k,obj.length);
      k=2*k;
    }
}
//如何进行分组
//k代表归并的序列长度 n代表的是总序列的长度
function MergePass(arr,arr1,s,n)
{
      var i=1;
      //最少还有两个可以归并
      while(i<=n-2*s+1)
      {
          Merge(arr1,arr,i,i+s-1,i+2*s-1);
          i+=(2*s);
      }
      //当还有两个分组时
      if(i<n-s+1)
          Merge(arr1,arr,i,i+s-1,n);
      else
      {//最多只有一个分组时
          for(i;i<=n;i++)
          {
            arr1[i]=arr[i];
          }
      }
}
function Merge(arr1,arr2,s,m,t)
{
    var i,j;
    //把s到t的元素按从小的到大的顺序存放到数组中
    for(i=s,j=m+1;s<=m && j<=t;i++)
    {
      if(arr2[s]<arr2[j])
        arr1[i]=arr2[s++];
      else
        arr1[i]=arr2[j++];
    }
    if(s<=m)
    {
      for(;s<=m;s++)
      {
        arr1[i++]=arr2[s];
      }
    }
    if(j<=t)
    {
      for(;j<=t;j++)
      {
        arr1[i++]=arr2[j];
      }
    }
}
var obj={
    data:[0,3,11,5,2,4,3,11,5],
    length:8
    }
MergingSort(obj);
console.log(obj.data);
MergingSort1(obj)
console.log(obj.data);
</script>

MergingSort的更多相关文章

  1. Java程序员必须掌握的8大排序算法

    分类: 1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基数排序) 所需辅助空间最多:归并排序所需辅助空间最少:堆 ...

  2. Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...

  3. [转]Java 常用排序算法/程序员必须掌握的 8大排序算法

    本文转自:http://www.cnblogs.com/qqzy168/archive/2013/08/03/3219201.html 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插 ...

  4. java SE 常用的排序算法

    java程序员会用到的经典排序算法实现 常用的排序算法(以下代码包含的)有以下五类: A.插入排序(直接插入排序.希尔排序) B.交换排序(冒泡排序.快速排序) C.选择排序(直接选择排序.堆排序) ...

  5. Java 常用排序算法/程序员必须掌握的 8大排序算法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...

  6. 面试常考的数据结构Java实现

    1.线性表 2.线性链表 3.栈 4.队列 5.串 6.数组 7.广义表 8.树和二叉树 的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒. 二叉树的性质: :在二叉树的第 i 层上至多有2 ...

  7. Java程序员必知的8大排序算法

    8种排序之间的关系 直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的.如 ...

  8. 排序算法 Java实现版

    8种排序之间的关系: 1. 直接插入排序 (1)基本思想: 在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序 ...

  9. java实现8种排序算法(详细)

    八种排序分别是:直接插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 希尔排序在时间性能上优于直接插入排序,但希尔排序是一种不稳定排序. 快速排序的时间性能也优于冒泡 ...

随机推荐

  1. List集合中的交集 并集和差集

    目录 List集合求交集 并集 差集 Set集合 Lambda表达式 List集合求交集 并集 差集 两种方法求集 Set集合 交集 两个集合中有相同的元素 抽取出来的数据就是为交集 @Test pu ...

  2. OO第四单元&课程总结

    一.本单元架构设计 第一次作业 本次作业要求解析UML类图. 首先,将UML中的各个元素(比如UmlClass.UmlInterface等)转化成自己定义的类(MyClass.MyInterface) ...

  3. 数据库MySQL四

    一.测试题 二.复习 说明:sql中的函数分为单行函数和分组函数 调用语法:select 函数名(实参列表); 1>字符函数 concat(str1,str2,..):拼接字符 substr(s ...

  4. Java实现基于朴素贝叶斯的情感词分析

    朴素贝叶斯(Naive Bayesian)是一种基于贝叶斯定理和特征条件独立假设的分类方法,它是基于概率论的一种有监督学习方法,被广泛应用于自然语言处理,并在机器学习领域中占据了非常重要的地位.在之前 ...

  5. Spring Boot 2.3 新特性优雅停机详解

    什么是优雅停机 先来一段简单的代码,如下: @RestController public class DemoController { @GetMapping("/demo") p ...

  6. 【CTF】CTFHub 技能树 文件头检查 writeup

    PHP一句话木马 <?php @eval($_POST["pass"]);?> <?php eval($_REQUEST["pass"]);? ...

  7. WPF-3D圆柱体透视

    3D圆柱体透视效果 总效果 原理: 3D面+面在摄像机方向上的2D投影点的集合 3D面效果: 2D线: 画线时需要注意两个点: 1 在圆柱体上下两个圆之间有两条竖着的棱边代表圆柱体边缘 2 被遮盖的圆 ...

  8. (十)VMware Harbor 日志管理

    VMware Harbor 日志管理 1. 项目日志 每个项目下都有一个"日志"页签. 单击"日志"可以列出所有日志.可以按用户名或"高级搜索&quo ...

  9. CSS 还能这样玩?奇思妙想渐变的艺术

    在之前的这篇文章 -- 一行 CSS 代码的魅力 中,我们介绍了一种使用一行 CSS 代码就能够生成的一种美妙(也许奇怪更合适)的背景. 本文,将继续介绍背景的一些有意思的知识,利用一些极小的单位,只 ...

  10. SpringCloud(四)GateWay网关

    GateWay网关 概述简介 Gateway是在 Spring生态系统之上构建的AP网关服务,基于 Spring5, Spring Boot2和 Project Reactor等技术. Gateway ...