MergingSort
- 递归排序的两种实现
<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的更多相关文章
- Java程序员必须掌握的8大排序算法
分类: 1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基数排序) 所需辅助空间最多:归并排序所需辅助空间最少:堆 ...
- Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法
Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...
- [转]Java 常用排序算法/程序员必须掌握的 8大排序算法
本文转自:http://www.cnblogs.com/qqzy168/archive/2013/08/03/3219201.html 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插 ...
- java SE 常用的排序算法
java程序员会用到的经典排序算法实现 常用的排序算法(以下代码包含的)有以下五类: A.插入排序(直接插入排序.希尔排序) B.交换排序(冒泡排序.快速排序) C.选择排序(直接选择排序.堆排序) ...
- Java 常用排序算法/程序员必须掌握的 8大排序算法
Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...
- 面试常考的数据结构Java实现
1.线性表 2.线性链表 3.栈 4.队列 5.串 6.数组 7.广义表 8.树和二叉树 的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒. 二叉树的性质: :在二叉树的第 i 层上至多有2 ...
- Java程序员必知的8大排序算法
8种排序之间的关系 直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的.如 ...
- 排序算法 Java实现版
8种排序之间的关系: 1. 直接插入排序 (1)基本思想: 在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序 ...
- java实现8种排序算法(详细)
八种排序分别是:直接插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 希尔排序在时间性能上优于直接插入排序,但希尔排序是一种不稳定排序. 快速排序的时间性能也优于冒泡 ...
随机推荐
- PureStudy:学科知识分享——个人网站开发全解
PureStudy:学科知识分享--个人网站开发全解 项目描述 PureStudy,学科知识分享网站. 学生可以使用这个网站,来浏览相应学科的知识点.学习总结,获取相关的资料.此外,他们可以选择上传文 ...
- Python数据分析入门(六):Pandas的函数应用
apply和applymap 1. 可直接使用NumPy的函数 示例代码: # Numpy ufunc 函数 df = pd.DataFrame(np.random.randn(5,4) - 1) p ...
- 1.设置和验证MySQL数据库的隔离级别
登录数据库 mysql -u root - p 新建用户,各启动一个事物,用于同时操作数据库表中数据 create user tom identified by 'tom'; 然后同时再用该用户启动M ...
- Day01_01_java背景
1.Java背景 --由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称. --Java语言是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由当 ...
- Django 入门范例
1. Django 介绍 2. Django 环境搭建 3. 模型(Model) 4. 站点管理 5. 视图(View) 6. 模板(Template) 1. Django 介绍 MVC 模型 大部分 ...
- 【并发编程】Java中的锁有哪些?
0.死锁 两个或者两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力作用,他们都将无法让程序进行下去: 死锁条件: 不可剥夺条件: T1持有的资源无法被T2剥夺 请 ...
- 【转】gitlab CI流水线配置文件.gitlab-ci.yml详解
目录 GitLab CI流水线配置文件.gitlab-ci.yml详解 实验环境 GitLab CI介绍 .gitlab-ci.yml 配置参数 参数详解 script image services ...
- hdu3472 混合欧拉
题意: 给你一些字符串,有的字符串反过来也有意义,题目问给的这n个字符串是否可以首尾相连,组成一个串. 思路: 算是混合欧拉的基础题目了,混合欧拉就是专门处理这类问题的,先说下 ...
- hdu4974 简单题
题意: 一个人看比赛,这些比赛一共有n个人参与,每一场有两个人比,然后每一场之后这个人都会给比赛的这两个人打分,最多1最少0,比如看完了A,B两人比赛,他可能给这两个人分别的分数是00,1 ...
- 使用QT creator实现一个五子棋AI包括GUI实现(8K字超详细)
五子棋AI实现 五子棋游戏介绍 五子棋的定义 五子棋是全国智力运动会竞技项目之一,是具有完整信息的.确定性的.轮流行动的.两个游戏者的零和游戏.因此,五子棋是一个博弈问题. 五子棋的玩法 五子棋有两种 ...