零、写在最前

  排序的方法有很多种,这篇文章只是记录我熟悉的算法;

  我发现了一个关于排序算法很有趣的网站,把相关的算法演示做成了动画,有兴趣的同学可以看看!

  附上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的几种排序算法的更多相关文章

  1. Javascript实现10种排序算法

    1.冒泡排序: 比较相邻的两个数,如果前一个数大于后一个数,就将这两个数换位置.每一次遍历都会将本次遍历最大的数冒泡到最后.为了将n个数排好序,需要n-1次遍历.如果某次遍历中,没有调整任何两个相邻的 ...

  2. 秒杀9种排序算法(JavaScript版)

    一:你必须知道的 1> JS原型 2> 排序中的有序区和无序区 3> 二叉树的基本知识 如果你不知道上面三个东西,还是去复习一下吧,否则,看下面的东西有点吃力. 二:封装丑陋的原型方 ...

  3. JavaScript实现的7种排序算法

    所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序.这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率.对于排序,我们首先要求 ...

  4. 几种排序算法的学习,利用Python和C实现

    之前学过的都忘了,也没好好做过总结,现在总结一下. 时间复杂度和空间复杂度的概念: 1.空间复杂度:是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算 ...

  5. 学习Java绝对要懂的,Java编程中最常用的几种排序算法!

    今天给大家分享一下Java中几种常见的排序算法的Java代码 推荐一下我的Java学习羊君前616,中959,最后444.把数字串联起来!     ,群里有免费的学习视频和项目给大家练手.大神有空时也 ...

  6. JavaScript十大经典排序算法

    排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序: 输入:n个数:a1,a2,a3,…,an输出:n个数的排列:a1’,a2’,a3’,…,an’,使得a1’ 再讲的形象点就是排排坐 ...

  7. JavaScript的9大排序算法详解

    一.插入排序 1.算法简介 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. ...

  8. PHP的几种排序算法的比较

    这里列出了几种PHP的排序算法的时间比较的结果,,希望对大家有所帮助 /* * php 四种排序算法的时间与内置的sort排序比较 * 3000个元素,四种算法的排序所用的时间比较 * 冒泡排序 85 ...

  9. C#常用8种排序算法实现以及原理简介

    public static class SortExtention { #region 冒泡排序 /* * 已知一组无序数据a[1].a[2].--a[n],需将其按升序排列.首先比较a[1]与a[2 ...

随机推荐

  1. xshell 6评估已过期解决办法 / xftp 6 评估已过期解决办法

    1.工具用途介绍 Xshell  是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议.Xshell 通过互联网到远程主机的安全 ...

  2. python基础之 异常处理和logging模块

    1.异常处理 l = ['apple','admin','kobe'] for id,item in enumerate(l,1): print(id,item) try: choose_id = i ...

  3. 下载文件 utils

    package cn.itcast.bos.utils;   import java.io.IOException; import java.net.URLEncoder;   import sun. ...

  4. 安装archlinux的linux命令记录

    磁盘的分区:cfdisk 格式化分区:mkfs.ext4,mkswap,swapon 查看所有分区:lsblk /dev/sda 先挂载 / 分区:mount /dev/sda1 /mnt archl ...

  5. scanperiod 不生效

    注意:要改 target 目录下的,真正运行时加载的 logback-spring.xml

  6. chm开源文档制作

    作为开发人员,API文档是非常关键的^_^,但是很多时候官方提供的文档是html的docs,不方便于携带查询,本章主要介绍chm文档的制作方法. 使用jd2chm制作chm文档 安装之前必须先安装 h ...

  7. Navigation包中的move_base和amcl实现自动驾驶

    安装功能包: 1.安装导航定位包navigation $ sudo apt-get install ros-indigo-navigation 2.由于导航包在/cmd_val下发布的移动数据加速度会 ...

  8. Docker Weave 介绍 or 工作原理

    Docker Weave Network Weave Network:属于第三方网络项目. Weave在Docker主机之间实现Overlay网络,使用业界标准VXLAN封装,基于UDP传输,也可以加 ...

  9. ASP.NET MVC:缓存功能的设计及问题

    这是非常详尽的asp.net mvc中的outputcache 的使用文章. [原文:陈希章 http://www.cnblogs.com/chenxizhang/archive/2011/12/14 ...

  10. Idea 提交代码到码云(提交到github也大同小异)

    1.首先下载安装git,下载地址https://git-scm.com/download/win.按默认选择安装即可,不成功的自行百度 2.安装完成后双击git.exe,调出命令界面(此处需要自己去申 ...