JS实现归并排序

这篇文章主要介绍了关于js实现归并排序,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

递归的内存堆栈分析

一直对递归理解不深,原因是递归的过程很抽象,分析不清内存堆栈的返回过程。偶然google到一篇博文递归(不得不说,技术问题还是要多google),对递归过程的内存堆栈分析豁然开朗,下面先列出分析过程:

// A C++ program to demonstrate working of recursion#includeusing namespace std;void printFun(int test){    if (test < 1)        return;    else    {        cout << test << " ";        printFun(test-1);    // statement 2        cout << test << " ";        return;    }}int main(){    int test = 3;    printFun(test);}

登录后复制

下面这个图准确的列出了整个递归的过程,以后遇到单次递归问题,完全可以用此方法分析(对于多次递归情况,尝试画了一下归并排序里的两次递归,实在没有办法整洁的排版,作罢。。)

4021399676-5b3d91bed0ad6_articlex[1].jpg

言归正传,下面分析归并排序。

归并排序

归并排序采用的是分治的思想,首先是“分”,将一个数组反复二分为两个小数组,直到每个数组只有一个元素;其次是“治”,从最小数组开始,两两按大小顺序合并,直到并为原始数组大小,下面是图解:

1679669172-5b3d91d862008_articlex[1].png

观察下“治”的过程,可以看出,“治”实际上是将已经有序的数组合并为更大的有序数组。那么怎样将已经有序的数组合并为更大的有序数组?很简单,创建一个临时数组C,比较A[0],B[0],将较小值放到C[0],再比较A[1]与B[0](或者A[0],B[1]),将较小值放到C[1],直到对A,B都遍历一遍。可以看出数组A,B都只需遍历一遍,所以对两个有序数组的排序的时间复杂度为O(n)。

而“分”就是将原始数组逐次二分,直到每个数组只剩一个元素,一个元素的数组自然是有序的,所以就可以开始“治”的过程了。

时间复杂度分析:分的过程需要三步:log8 = 3,而每一步都需要遍历一次8个元素,所以8个元素共需要运行 8log8)次指令,那么对于 n 个元素,时间复杂度为 O(nlogn)。

代码中运用了两次递归,十分抽象难懂,画了一整页堆栈调用图,才弄明白(太凌乱就不贴了),大家可以试试。

// 融合两个有序数组,这里实际上是将数组 arr 分为两个数组function mergeArray(arr, first, mid, last, temp) {  let i = first;   let m = mid;  let j = mid+1;  let n = last;  let k = 0;  while(i<=m && j<=n) {    if(arr[i] < arr[j]) {      temp[k++] = arr[i++];    } else {      temp[k++] = arr[j++];    }  }  while(i<=m) {    temp[k++] = arr[i++];  }  while(j<=n) {    temp[k++] = arr[j++];  }   for(let l=0; l<k; l++) {    arr[first+l] = temp[l];  }  return arr;}// 递归实现归并排序function mergeSort(arr, first, last, temp) {  if(first<last) {    let mid = Math.floor((first+last)/2);    mergeSort(arr, first, mid, temp);    // 左子数组有序    mergeSort(arr, mid+1, last, temp);   // 右子数组有序    arr = mergeArray(arr, first, mid, last, temp);    }  return arr;}// examplelet arr = [10, 3, 1, 5, 11, 2, 0, 6, 3];let temp = new Array();let SortedArr = mergeSort(arr, 0 ,arr.length-1, temp);alert(SortedArr);

登录后复制

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

JS实现希尔排序

Jquery添加loading过渡遮罩

以上就是JS实现归并排序的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2746913.html

(0)
上一篇 2025年3月8日 04:14:26
下一篇 2025年2月19日 21:20:19

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 原生JS基于window.scrollTo()封装垂直滚动动画工具函数

    这篇文章主要介绍了关于原生js基于window.scrollto()封装垂直滚动动画工具函数 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 概要: 原生JS基于window.scrollTo()封装垂直滚动动画工具函数,可…

    编程技术 2025年3月8日
    200
  • JS实现堆排序

    这篇文章主要介绍了关于js实现堆排序,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 堆的预备知识 堆是一个完全二叉树。 完全二叉树: 二叉树除开最后一层,其他层结点数都达到最大,最后一层的所有结点都集中在左边(左边结点排列满…

    2025年3月8日 编程技术
    200
  • react 官网动画库(react-transition-group)的新写法

    这篇文章主要介绍了关于react 官网动画库(react-transition-group)的新写法 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 一、react-transition-group 一个官网提供的动画过度库…

    编程技术 2025年3月8日
    200
  • node爬取拉勾网数据并导出为excel文件

    这篇文章主要介绍了关于node爬取拉勾网数据并导出为excel文件,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 前言 之前断断续续学习了node.js,今天就拿拉勾网练练手,顺便通过数据了解了解最近的招聘行情哈!node方…

    2025年3月8日 编程技术
    200
  • async/await 并行请求和错误处理

    这篇文章主要介绍了关于async/await 并行请求和错误处理,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 async 顺序 并发请求 使用async的时候,代码执行的顺序很容易出错,比如我们要同时发起两个请求,可能会写…

    2025年3月8日
    200
  • 用Node编写RESTful API接口

    这篇文章主要介绍了关于用node编写restful api接口 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 前言 本文将通过一个todo list前后端分离的小项目来讲解如何用Node创建符合RESTful风格的API接…

    2025年3月8日
    200
  • Javascript装饰器的用法

    这篇文章主要介绍了关于javascript装饰器的用法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 最近新开了一个Node项目,采用TypeScript来开发,在数据库及路由管理方面用了不少的装饰器,发觉这的确是一个好东西…

    编程技术 2025年3月8日
    200
  • 如何解决JS高程中的垃圾回收机制与常见内存泄露的问题

    这篇文章主要介绍了关于如何解决js高程中的垃圾回收机制与常见内存泄露的问题,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 前言 起因是因为想了解闭包的内存泄露机制,然后想起《js高级程序设计》中有关于垃圾回收机制的解析,之前…

    编程技术 2025年3月8日
    200
  • 如何禁止JavaScript对象重写

    这篇文章主要介绍了关于如何禁止javascript对象重写,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 译者按: 使用Object.preventExtensions()、Object.seal()和Object.free…

    编程技术 2025年3月8日
    200
  • ES6 Class 继承与 super的介绍

    这篇文章主要介绍了关于es6 class 继承与 super的介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 Class 继承与 super class 可以 extends 自另一个 class。这是一个不错的语法,技…

    2025年3月8日 编程技术
    200

发表回复

登录后才能评论