热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript实现各种排序算法

前言:本文主要是用JavaScript实现数据结构中的各种排序算法,例如:插入排序、希尔排序、合并排序等。冒泡排序functionbubb

 

前言:本文主要是用Javascript实现数据结构中的各种排序算法,例如:插入排序
、希尔排序、合并排序等。

 

冒泡排序


 

function bubbleSort(arr) {console.time("冒泡排序")var num = 0;for (var i = arr.length; i > num; num++) {for (var j = i - 1; j > num; j--) {if(arr[j-1]>arr[j]){var temp = arr[j-1];arr[j-1] = arr[j];arr[j] = temp;}}}console.timeEnd("冒泡排序")return arr}var arr = [12, 290, 219, 278, 4432,21, 43, 89, 78];console.log( bubbleSort(arr));

 

时间复杂度: 最差 O(n2) ; 最优 O(n)

 

插入排序


 插入排序的基本原理如下图:从前向后构建有序序列,对于未排序序列,在已排序的序列中从后向前扫描插入位置,对于第p个元素,需要扫描p-1次,平均来说插入排序算法复杂度为O(n2)

function insertSort(arr) {console.time("插入排序")var len &#61; arr.length;if (len <&#61; 1) {return arr;}// 1~n-1趟排序arr.map(function(item,index){if(index>0){for (var j &#61; index; j > 0 && arr[j - 1] > item; j--) {arr[j] &#61; arr[j - 1];}arr[j] &#61; item;}});console.timeEnd("插入排序")return arr
}
var arr &#61; [12, 290, 219, 278, 4432, 21, 43, 89, 78];
console.log(insertSort(arr));

 

 

希尔排序


 shell排序也称为递减增量排序&#xff0c;效果比插入排序更好&#xff0c;对于不同的增量&#xff0c;排序性能也不同

下面我们看看 步长选择为

算法实现过程如下&#xff1a;这里我们选择 步长为4&#xff1a;&#xff08;每一列相当于一次插入排序&#xff09;

12 190 219 278
4432 21 43 89
78
// 第一次排序之后得到&#xff1a;
12 21 43 89
78 190 219 278
4432// 连接起来得到的是 [12&#xff0c;21&#xff0c;43&#xff0c;89&#xff0c;78&#xff0c;190&#xff0c;219&#xff0c;278&#xff0c;4432]&#xff0c;接着以2为步长 排序之后变为:
12 21
43 89
78 190
219 278
4432// 然后就是简单的插入排序

平均时间复杂度为&#xff1a; 

 快速排序实现2&#xff1a; &#xff08;以中间的为基准值&#xff09;

1 function qSort(arr) {
2 if (arr.length <&#61; 1) {
3 return arr;
4 }
5 var num &#61; Math.floor(arr.length / 2);
6
7 var numValue &#61; arr.splice(num, 1)[0];
8 var left &#61; [],
9 right &#61; [];
10 for (var i &#61; 0; i ) {
11 if (arr[i] < numValue) {
12 left.push(arr[i]);
13 } else {
14 right.push(arr[i]);
15 }
16 }
17 return qSort(left)
18 .concat([numValue], qSort(right))
19 }
20
21 console.log(qSort([32, 45, 37, 16, 2, 87]))

 

快速排序的平均时间复杂度为O(NLogN)

合并排序

 合并排序采用分治法的思想对数组进行分治&#xff0c;对半分开&#xff0c;分别对左右两边进行排序&#xff0c;然后将排序后的结果进行合并。按照这样的思想&#xff0c;递归做是最方便的。

1 int a[N], c[N];
2 void mergeSort(l, r) {
3 int mid, i, j, tmp;
4 if (r - 1 > l) {
5 mid &#61; (l &#43; r) >> 1;
6 // 分别最左右两天排序
7 mergeSort(l, mid);
8 mergeSort(mid, r);
9 // 合并排序后的数组
10 tmp &#61; l;
11 for (i &#61; l, j &#61; mid; i r;) {
12 if (a[i] > a[j]) c[tmp&#43;&#43;] &#61; a[j&#43;&#43;];
13 else c[tmp&#43;&#43;] &#61; a[i&#43;&#43;];
14 }
15 // 把剩余的接上
16 if (j < r) {
17 for (; j a[j];
18 } else {
19 for (; i a[i];
20 }
21 // 将c数组覆盖到a里
22 for (i &#61; l; i ) {
23 a[i] &#61; c[i];
24 }
25 }
26 }

 

 

 

结束语

  更新几种排序算法的实现

转:https://www.cnblogs.com/kasmine/p/6416472.html



推荐阅读
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
author-avatar
你说Dan_795
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有