记一下JavaScript的几种排序算法
零、写在最前
排序的方法有很多种,这篇文章只是记录我熟悉的算法;
我发现了一个关于排序算法很有趣的网站,把相关的算法演示做成了动画,有兴趣的同学可以看看!
附上SortAnimate网站链接:http://jun-lu.github.io/SortAnimate/index.html
一、冒泡排序
这是一种最基础的排序算法,也就是入门级别的算法!
原理:两两检测,比较两者之间的大小关系,大的往后丢!
function bubbleSort(arr){
for(var i=0;i<arr.length;i++){
for(var j=0;i<arr.length-i-1;i++){
if(arr[j]>arr[j+1]){
var temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
return arr;
}
二、快速排序
常用、排序速度快,但有点浪费内存空间!
原理:以中间基准点为中心进行比较,小的放左,大的放右,需要另外的2个数组存放;
function quickSort(arr){
if (arr.length <= 1) { return arr; }
var index=Math.floor(arr.length/2);
var center=arr.splice(index,1)[0];
var left=[],right=[];
for(var i=0;i<arr.length;i++){
arr[i]<center ? left.push(arr[i]) : right.push(arr[i]);
}
return quickSort(left).concat([center],quickSort(right));
}
三、插入排序
原理:逐个检测,最大的往最后丢,每次减少检测次数!
function insertSort(arr){
var arrLen=arr.length;
for(var i=0;i<arrLen;i++){
var index=0;
for(var j=1;j<arrLen-i;j++){
if(arr[j]>arr[index]) index=j;
}
var temp=arr[arrLen-i-1];
arr[arrLen-i-1]=arr[index];
arr[index]=temp;
}
return arr;
}
四、归并排序 (2019/03/14补充)
算法原理简单说就是拆分与合并的过程;
拆分:反复一拆为二,直到独立为一个为止 (中间有个递归的过程,数据量大会遭遇溢出)
合并:向上回溯,做到有序排列
代码如下:
(function () {
//例子:
let arr = [2,5,4,6,9,111,0,8,1];
function mergeFn(left, right) {
//合并
let tem = [];
while (left.length > 0 && right.length > 0) {
if (left[0] < right[0]) {
tem.push(left.shift());
} else {
tem.push(right.shift());
}
}
return tem.concat(left, right); //返回最终的数组结果
}
function slitFn(data) {
//拆分
let dataLen = data.length;
if (dataLen === 1) {
return data;
}
let midNum = Math.floor(dataLen / 2); //获取中间下标
let leftData = data.slice(0, midNum);
let rightData = data.slice(midNum);
return mergeFn(slitFn(leftData), slitFn(rightData));
}
console.log(slitFn(arr));
})()
PS:具体分析或者是数据溢出处理可以参考 韩子迟的博客
五、选择排序 (2019/5/13补充)
选择排序是一种简单直观的排序算法;
原理: 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 ; 然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾; 以此类推,直到所有元素均排序完毕。

function selectionSort (arr) {
var len = arr.length;
var minIndex, temp;
for (var i = 0; i < len-1; i++) {
minIndex = i;
for (var j = i+1; j < len; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j
}
}
temp = arr[minIndex]
arr[minIndex] = arr[i]
arr[i] = temp
}
return arr
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
selectionSort(arr)
六、结尾
排序算法还有 选择排序、希尔排序、二分排序等等.......
选择算法还需要考虑时间复杂度、稳定性、数据重复量多少;
我以后再学习,再来补充这篇文章!
-------------------- End ---------------------
记一下JavaScript的几种排序算法的更多相关文章
- Javascript实现10种排序算法
1.冒泡排序: 比较相邻的两个数,如果前一个数大于后一个数,就将这两个数换位置.每一次遍历都会将本次遍历最大的数冒泡到最后.为了将n个数排好序,需要n-1次遍历.如果某次遍历中,没有调整任何两个相邻的 ...
- 秒杀9种排序算法(JavaScript版)
一:你必须知道的 1> JS原型 2> 排序中的有序区和无序区 3> 二叉树的基本知识 如果你不知道上面三个东西,还是去复习一下吧,否则,看下面的东西有点吃力. 二:封装丑陋的原型方 ...
- JavaScript实现的7种排序算法
所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序.这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率.对于排序,我们首先要求 ...
- 几种排序算法的学习,利用Python和C实现
之前学过的都忘了,也没好好做过总结,现在总结一下. 时间复杂度和空间复杂度的概念: 1.空间复杂度:是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算 ...
- 学习Java绝对要懂的,Java编程中最常用的几种排序算法!
今天给大家分享一下Java中几种常见的排序算法的Java代码 推荐一下我的Java学习羊君前616,中959,最后444.把数字串联起来! ,群里有免费的学习视频和项目给大家练手.大神有空时也 ...
- JavaScript十大经典排序算法
排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序: 输入:n个数:a1,a2,a3,…,an输出:n个数的排列:a1’,a2’,a3’,…,an’,使得a1’ 再讲的形象点就是排排坐 ...
- JavaScript的9大排序算法详解
一.插入排序 1.算法简介 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. ...
- PHP的几种排序算法的比较
这里列出了几种PHP的排序算法的时间比较的结果,,希望对大家有所帮助 /* * php 四种排序算法的时间与内置的sort排序比较 * 3000个元素,四种算法的排序所用的时间比较 * 冒泡排序 85 ...
- C#常用8种排序算法实现以及原理简介
public static class SortExtention { #region 冒泡排序 /* * 已知一组无序数据a[1].a[2].--a[n],需将其按升序排列.首先比较a[1]与a[2 ...
随机推荐
- jenkins使用笔记
jenkins动态在构建的时候给脚本传递参数 1.任务 >General > 参数化构建过程 >选项参数 2.把变量传递给shell脚本 3.构建的时候给参数赋值 4.shell脚 ...
- Python Async/Await入门指南
转自:https://zhuanlan.zhihu.com/p/27258289 本文将会讲述Python 3.5之后出现的async/await的使用方法,以及它们的一些使用目的,如果错误,欢迎指正 ...
- cherry-pick时的add by us / both modified / delete by us /delete by themk
简单来说: us=into , them=from 比如你将test分支的某个提交cherry-pick到master分支上,那么us就是master分支,them 就是test分支 参考: http ...
- 20175211 2018-2019-2 《Java程序设计》第二周学习总结
目录 教材学习内容总结 第二章 第三章 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题总结 其他(感悟.思考等,可选) 学习进度条 参考资料 教材学习内容总结 第二章 ...
- 台式电脑、笔记本快捷选择启动项Boot 快捷键大全
我们在安装系统时,会去设置电脑是从硬盘启动.U盘启动.光驱启动.网卡启动. 一般设置的方法有两种:一种是进BIOS主板菜单设置启动项顺序:另一种就是我在这里要介绍的快捷选择启动项. 以下是网友整理的各 ...
- Git 在 windows 上面的安装
参考博客: https://blog.csdn.net/xiezhongyuan07/article/details/79411299 将该作者的文章搬过来, 大家可以直接看上面的原文章. 下面是拷贝 ...
- 第七篇——Struts2的接收参数
Struts2的接收参数 1.使用Action的属性接收参数 2.使用Domain Model接收参数 3.使用ModelDriven接收参数 项目实例 1.项目结构 2.pom.xml <pr ...
- The type groovy.lang.GroovyObject cannot be resolved
很明显是:编译 Groovy 不通过 解决办法:添加 Groovy 包 比如 maven 项目里: <dependency> <groupId>org.codehaus.gro ...
- Jmeter对jar包的调用赋值
一.前言 在我们测试接口的过程中,可能有时需要用到第三方jar包来生成一些测试数据(如有时需要对参数的输入值使用第三方jar包进行加密操作),涉及到这种的情况,普遍做法是:手动调用jar包获得需要的值 ...
- 创建servlet程序知识点详解---servlet-day05
jdbc.properties怎么写? 把秘密改为自己电脑设置的 password url 3306 是安装mysql时所确定的端口 后面还可以接字符集的限定 #1 jsp是什么?(java ser ...