js排序算法详解-归并排序
2017-09-21 20:16
375 查看
全栈工程师开发手册 (作者:栾鹏)
js系列教程5-数据结构和算法全解
有点抽象了,那就具体化,比如现在有个十万人的司令部,习大大是首长,习大大跟司令说了,把所有的人按年龄排序,司令想了,让我一个人也忙活不过来啊,这怎么办,然后就把任务下达给军长,军长下达给师长,依次类推,排长再把一个排分成两个小队,小队再分成两个小组,最后分成两个人一组或一人一组,接下来就是组员之间进行比较,完了小队与小队比较,排与排之间比较,依次类推,最后军团和军团比较,形成最后的序列。
废话不多说,看代码:
其实代码并不难理解,小编就不详解了。
配上动图加深印象:
js系列教程5-数据结构和算法全解
js排序算法详解-归并排序
归并排序其实可以类比二分法,二分法其实就是二等分的意思,简而言之就是不断和新序列的中间值进行比较。归并排序似乎有异曲同工之妙,什么意思呢,就是将一个原始序对等分为两部分,然后不断地对等分新的序列,直至序列的长度为1或者2,那么想,如果一个序列为1,那就没有比较的意义了,它本身就是之最,如果是两个呢,那直接比较不就完了,把比较之后的值推送到一个新的数组。就这样不断地细分,不断的产生子序列,然后把穿产生的新序列作为新的父序列,然后同等级的父序列再比较产生新的祖序列,依次类推。有点抽象了,那就具体化,比如现在有个十万人的司令部,习大大是首长,习大大跟司令说了,把所有的人按年龄排序,司令想了,让我一个人也忙活不过来啊,这怎么办,然后就把任务下达给军长,军长下达给师长,依次类推,排长再把一个排分成两个小队,小队再分成两个小组,最后分成两个人一组或一人一组,接下来就是组员之间进行比较,完了小队与小队比较,排与排之间比较,依次类推,最后军团和军团比较,形成最后的序列。
废话不多说,看代码:
function mergeSort(arr) { //采用自上而下的递归方法 var len = arr.length; if(len < 2) { return arr; } var middle = Math.floor(len / 2), left = arr.slice(0, middle), right = arr.slice(middle); return merge(mergeSort(left), mergeSort(right)); } function merge(left, right){ var result = []; console.time('归并排序耗时'); while (left.length && right.length) { if (left[0] <= right[0]) { result.push(left.shift()); } else { result.push(right.shift()); } } while (left.length){ result.push(left.shift()); } while (right.length){ result.push(right.shift()); } console.timeEnd('归并排序耗时'); return result; } var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; console.log(mergeSort(arr));
其实代码并不难理解,小编就不详解了。
配上动图加深印象:
相关文章推荐
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 面试之路(16)-归并排序详解(MergeSort)递归和非递归实现
- js排序算法详解-桶排序
- 归并排序与分治算法详解
- js排序算法详解-基数排序
- 归并排序递归思想,代码详解!!!!
- 归并排序详解(python实现)
- PHP排序算法系列之归并排序详解
- 面试之路(16)-归并排序详解(MergeSort)递归和非递归实现
- 详解PHP归并排序的实现
- 归并排序详解
- 2-3.归并排序详解
- 数据结构-排序算法详解(插入排序,希尔排序,堆排序,归并排序,快速排序,桶式排序)
- 排序算法详解【归并排序-Merge_Sort】
- 归并排序的详解
- 排序算法详解【归并排序-Merge_Sort】
- 【内部排序】八:归并排序(Merge Sort)详解与代码
- [027]八大排序算法详解——归并排序
- 使用C#详解常用排序算法(三):归并排序(Merge Sort)
- java 算法之归并排序详解及实现代码