记一下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 ...
随机推荐
- RVIZ实现模拟控制小车
RVIZ是一个强大的可视化工具,可以看到机器人的传感器和内部状态. 1.安装rbx1功能包Rbx1是国外一本关于ros的书中的配套源码,包含了机器人的基本仿真.导航.路径规划.图像处理.语音识别等等. ...
- python进阶之 进程编程
1.进程 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内 ...
- 竖倾斜ScrollView
using UnityEngine; using UnityEngine.EventSystems; public class ObliqueScroll : MonoBehaviour,IDragH ...
- linux挂载概念简述:
挂载概念简述: 根文件系统之外的其他文件要想能够被访问,都必须通过“关联”至根文件系统上的某个目录来实现,此关联操作即为“挂载”,此目录即为“挂载点”,解除此关联关系的过程称之为“卸载” 1.挂载:根 ...
- 下拉选择插件select2赋值、创建、清空
在select2中,设置指定值为选中状态 $("#select2_Id").val("XXXXX").select2()或者$("#latnId&qu ...
- haier周的计算原则
现使用oracle的sql表示出haier周, 经过对其生成结果的分析,发现海尔周是以周日到周六分别作为一周的始末, 用到的oracle sql中会涉及到calendar week的定义,还涉及到了I ...
- NGUI与特效的层级关系
通过调整特效的 render queue 来解决特效与NGUI界面之间的层级关系问题,用以下脚本解决: using System.Collections.Generic; using UnityEng ...
- QT https 程序运行异常
[1]问题现象描述 利用QT的https方式访问服务器,添加了libeay32.dll 和 ssleay32.dll, 且一直都使用正常. 正常现象:返回200,且该获取的值都正常返回(即replyB ...
- Python 两个星号(**)的 参数
将参数以字典的形式导入
- (转) SpringMVC学习笔记-
一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--conf ...