另一道面试题是实现归并排序,当然,本人很不喜欢递归法,因为递归一般都是没有迭代法好。所以首选都是用迭代法,但是迭代法确实是难做啊,至底而上的思想不好把握。

这是我的实现代码

/*
*
* 非递归版归并排序,思路如下:
* 至底而上的思路,二和一,四和一,最后是一半一半和整。
* 循环从左到右依次执行,为了节省空间,我节省了右序列,将原数列的一部分作为右小序列,这一部分不会被覆盖。
* 作者:吴伟欣
* */
function mergeSearch(arr)
{
var len = arr.length;
var left_s,left_e,right_s,right_e;
var left_list = null; //只需要一半即可,节省空间,因为原数组后半段是不可能被覆盖的。
for (var i = 1;i<len;i*=2)
{
var next = 0;//每一次合并以后初始化next
for(left_s=0;left_s<len;left_s=right_e)
{
next = left_s;
left_e = right_s = left_s + i;
right_e = right_s + i;
if(right_e > len)
{
right_e = len;
}
//复制左边的数组
left_list = arr.slice(left_s,left_e);
var left_index = 0;
var left_len = left_list.length;//空间换取时间
while(left_index<left_len) //归并代码
{
if((right_s>=right_e)||(left_list[left_index]<=arr[right_s])) //短路逻辑,优化性能
{
arr[next++] = left_list[left_index++];
}else
{
arr[next++] = arr[right_s++];
}
}
}
}
}
//测试代码
var a = [3,7,1,2,10,9,1,6];
var b = [10,9,8,2,7,10,10,10,9,9,9,8];
mergeSearch(a);
mergeSearch(b);
alert(a);
alert(b);

  运行结果还是正确的:

首先,归并思路应该不难写。我的思路是这样的,先整体思维是,很自然的从单个合并,然后在合并,最后合成一个整体。每次都是两两合并。细节方面是,合并的时候到底怎么做比较好呢,可以想象,我们可以创建一个整数列,然后合并的时候放进去,整条合并完,在给原来的,这当然是很笨的方式。我采用的是,每两个需要合并的子序列肯定是不可以在原数列的空间上进行排序,但是至少需要多少空间呢,你会发现,这两个序列的右边那个是不可能被覆盖,那意味着,这两个序列的右边序列是可以在原数列上玩,左序列我会每次创建空间,然后放进原数列。短路逻辑那里,是考虑到如果左边序列完全排序好了,那么右序列默认是在原序列上,并且排好序,所以很明显已经搞定,后面的是不需要在动了,直接进入下一个序列合并。整体最坏复杂度,应该是这样的,一个logn 和一个n循环,整体应该是nlogn

javascript实现非递归--归并排序的更多相关文章

  1. Java实现非递归归并排序

    public class nonRecursiveMergeSort { public static void main(String[] args) { int[] list = {8,4,3,6, ...

  2. 【Java】 归并排序的非递归实现

    归并排序可以采用递归方法(见:归并排序),但递归方法会消耗深度位O(longn)的栈空间,使用归并排序时,应该尽量使用非递归方法.本文实现了java版的非递归归并排序. 更多:数据结构与算法合集 思路 ...

  3. 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java

    前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...

  4. 归并排序(非递归,Java实现)

    归并排序(非递归):自底向上 public class MergeSort { /** * @param arr 待排序的数组 * @param left 本次归并的左边界 * @param mid ...

  5. 面试之路(16)-归并排序详解(MergeSort)递归和非递归实现

    归并排序的概念及定义 归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并排序是建立 ...

  6. Java归并排序的递归与非递归实现

    该命题已有无数解释,备份修改后的代码 平均时间复杂度: O(NLogN)  以2为底 最好情况时间复杂度: O(NLogN) 最差情况时间复杂度: O(NLogN) 所需要额外空间: 递归:O(N + ...

  7. 排序算法练习--JAVA(插入、直接选择、冒泡、快速排序、非递归快速排序)

    排序算法是数据结构中的经典算法知识点,也是笔试面试中经常考察的问题,平常学的不扎实笔试时候容易出洋相,回来恶补,尤其是碰到递归很可能被问到怎么用非递归实现... package sort; impor ...

  8. c++(非递归排序)

    在上面一篇博客当中,我们发现普通查找和排序查找的性能差别很大.作为一个100万的数据,如果使用普通的查找方法,那么每一个数据查找平均下来就要几十万次,那么二分法的查找呢,20多次就可以搞定.这中间的差 ...

  9. 算法笔记_013:汉诺塔问题(Java递归法和非递归法)

    目录 1 问题描述 2 解决方案  2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...

随机推荐

  1. linux第8天 connect强化

    今天没有系统学习什么新知识,就是把以前学到的知识复习了一下,其中有几点值得注意 connect(fd, (struct sockaddr *)addr, sizeof(struct sockaddr_ ...

  2. Codeforces Round #312 (Div. 2) E. A Simple Task

    题目大意就是给一个字符串,然后多个操作,每次操作可以把每一段区间的字符进行升序或者降序排序,问最终的字符串是多少. 一开始只考虑字符串中字符'a'的情况,假设操作区间[L,R]中有x个'a',那么一次 ...

  3. firefox中 checkbox属性checked="checked"已有,但复选框却不显示打钩的原因

    最近在调试复选框的应用,在ie没有问题,考虑到兼容性,试试了firefox,遇到了问题. 复选框绑定了click事件,点一次选中,再点击取消选中,依次类推.这个功能在ie中没问题,但是在firefox ...

  4. 前端开发与Seo基础

    网页代码优化       1:<title>标题:强调重点,重点关键词放在前面,每个页面的title尽量不相同 2:<meta keywords>关键词:列举出几个重要关键词, ...

  5. dtree的使用和扩展

    相信用过dtree的童靴的不在少数,网络上流传的JS树有很多,例如雪花树MzTreeView,EXT.Struts2出来之后,也有自己的树控件,但是这么多风姿卓约的倩影中,我独爱,独爱dtree那一棵 ...

  6. paper 48: Latex中如何制作参考文献

    文章写到现在,最后一步就要大功告成了!reference,let's go! 一.用Google来做Latex的bib文件 1. 打开scholar.google.com 2. 定制   Schola ...

  7. paper 28 :一些常见常用数据库的下载网站集锦

    做图像处理+模式识别的童鞋怎么可以没有数据库呢? 但是,如果自己做一个数据库,费时费力费钱先不说,关键是建立的数据库的公信力一般不会高,做出的算法也别人也不好比较,所以呢,下载比较权威的公共数据库还是 ...

  8. [转载]Emmet使用手册

    转载地址:  http://www.w3cplus.com/tools/emmet-cheat-sheet.html 介绍 Emmet (前身为 Zen Coding) 是一个能大幅度提高前端开发效率 ...

  9. 解析php mysql 事务处理回滚操作

    论坛扣币项目中,用户支付论坛币的时候如果突然断网.电脑死机.停电.等其它自然灾害时,导致本次交易没有成功(即用户的币已经扣掉了,但是服务器数据库中没有消费记录等其它情况),这种情况应该怎么样进行处理呢 ...

  10. 转:MyEclipse8.6插件安装方法

    通常,我们可以用update来直接安装.但是myeclipse限制了中国区的下载和更新.所以我们只能用插件配置的方法来实现. MyEclipse8.6插件安装同Eclipse插件安装方式大致相同,如下 ...