(冒泡排序、快排顺序、选择排序、插入排序、归并排序)

下面是前端比较常用的五个算法demo:

冒泡算法:比较两个相邻的数值,if第一个>第二个,交换他们的位置元素项向上移动至正确的顺序。

function bubbleSort(arr) {
let len = arr.length;
for (let i = ; i < len; i++) {
for (let j = ; j < len - - i; j++) {
if (arr[j] > arr[j+]) { //相邻元素两两对比
[arr[j + ], arr[j]] = [arr[j], arr[j + ]];
}
}
}
return arr;
}

快排顺序:对冒泡算法的改进,分三步走,(1)在数组中选择一个中间项作为主元   (2)划分操作:创建两个指针,左边的指向数组的第一项,右边的指向数组的最后一项。然后移动左指针,直到找到一个比主元的项大。接着移动右边的指针,直到找到比主元小的项,最后交换它们。重复这个过程,直到左侧的指针超过了右侧的指针。这个使比主元小的都在左侧,比左元大的都在右侧。 (3)比主元小的值组成一个小数组,比主元大的值组成小数组,然后重复前面的两个步骤,直到排序完成。

function quickSort(arr, left, right) {
let len = arr.length;
let partitionIndex;
left = typeof left !== 'number' ? : left;
right = typeof right !== 'number' ? len - : right;
if (left < right) {
partitionIndex = partition(arr, left, right);
quickSort(arr, left, partitionIndex - );
quickSort(arr, partitionIndex + , right);
}
return arr;
} function partition(arr, left, right) { //分区操作
let pivot = left; //设定基准值(pivot)
let index = pivot + ;
for (let i = index; i <= right; i++) {
if (arr[i] < arr[pivot]) {
[arr[i], arr[index]] = [arr[index], arr[i]];
index++;
}
}
[arr[pivot], arr[index - ]] = [arr[index - ], arr[pivot]];
return index - ;
}

选择排序:找到最小值放在第一位,找到第二小的放在第二位,以此类推

function selectionSort(arr) {
let len = arr.length;
let minIndex;
for (let i = ; i < len - ; i++) {
minIndex = i;
for (let j = i + ; j < len; j++) {
if (arr[j] < arr[minIndex]) { //寻找最小的数
minIndex = j; //将最小数的索引保存
}
}
[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
}
return arr;
}

插入排序:每次排一个数组项,假设数组的第一项已经排序,接着,把第二项与第一项进行对比,第二项是该插入第一项前面还是后面,第三项是插到第一项前面还是后面

function insertionSort(arr) {
let len = arr.length;
let preIndex, current;
for (let i = ; i < len; i++) {
preIndex = i - ;
current = arr[i];
while (preIndex >= && arr[preIndex] > current) {
arr[preIndex + ] = arr[preIndex];
preIndex--;
}
arr[preIndex + ] = current;
}
return arr;
}

归并排序:前面三种排序性能不好,归并排序性能好,归并排序是一种分治算法,本质上就是把一个原始数组切分成比较小的数组,直到每个小数组只有一个位置,接着把最小数组归并成比较大的数组,在归并过程中也会完成排序,直到最后只有一个排序完毕的大数组。

function mergeSort(arr) {
//采用自上而下的递归方法
let len = arr.length;
if(len < ) {
return arr;
}
let middle = Math.floor(len / ),
left = arr.slice(, middle),
right = arr.slice(middle);
return merge(mergeSort(left), mergeSort(right));
} function merge(left, right){
let result = [];
while (left.length && right.length) {
if (left[] <= right[]) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}
result.push(...left);
result.push(...right);
return result;
}

堆排序:把数组当中的二叉树来排序,4个步骤:(1)索引0是根节点 (2)任意的节点的父节点是N/2(除了根节点)

(3)节点L的左子节点是2*L (4)节点R的子节点是2*R+1

堆排序其实就是先构建二叉树,然后把根节点与最后一个进行交换,接着对剩下的元素进行二叉树构建,进行交换、直到剩下最后一个。

var len;    //len设置成为全局变量

function buildMaxHeap(arr) {   //建立大顶堆
len = arr.length;
for (let i = Math.floor(len / ); i >= ; i--) {
heapify(arr, i);
}
} function heapify(arr, i) { //堆调整
let left = * i + ;
let right = * i + ;
let largest = i;
if (left < len && arr[left] > arr[largest]) {
largest = left;
}
if (right < len && arr[right] > arr[largest]) {
largest = right;
}
if (largest !== i) {
[arr[i], arr[largest]] = [arr[largest], arr[i]];
heapify(arr, largest);
}
} function heapSort(arr) {
buildMaxHeap(arr);
for (let i = arr.length - ; i > ; i--) {
[arr[],arr[i]]=[arr[i],arr[]];
len--;
heapify(arr, );
}
return arr;
}

js 前端常用排序算法总结的更多相关文章

  1. JS实现常用排序算法—经典的轮子值得再造

    关于排序算法的博客何止千千万了,也不多一个轮子,那我就斗胆粗制滥造个轮子吧!下面的排序算法未作说明默认是从小到大排序. 1.快速排序2.归并排序3.冒泡排序4.选择排序(简单选择排序)5.插入排序(直 ...

  2. javascript常用排序算法实现

    毕业后,由于工作中很少需要自已去写一些排序,所以那些排序算法都忘得差不多了,不过排序是最基础的算法,还是不能落下啦,于是找了一些资料,然后用Javascript实现了一些常用的算法,具体代码如下: & ...

  3. Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...

  4. 转载部长一篇大作:常用排序算法之JavaScript实现

    转载部长一篇大作:常用排序算法之JavaScript实现 注:本文是转载实验室同门王部长的大作,找实习找工作在即,本文颇有用处!原文出处:http://www.cnblogs.com/ywang172 ...

  5. Java 常用排序算法/程序员必须掌握的 8大排序算法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...

  6. 常用排序算法的python实现和性能分析

    常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...

  7. 面试中常用排序算法实现(Java)

    当我们进行数据处理的时候,往往需要对数据进行查找操作,一个有序的数据集往往能够在高效的查找算法下快速得到结果.所以排序的效率就会显的十分重要,本篇我们将着重的介绍几个常见的排序算法,涉及如下内容: 排 ...

  8. 常用排序算法java实现

    写在前面:纸上得来终觉浅.基本排序算法的思想,可能很多人都说的头头是到,但能说和能写出来,真的还是有很大区别的. 今天整理了一下各种常用排序算法,当然还不全,后面会继续补充.代码中可能有累赘或错误的地 ...

  9. 我们一起来排序——使用Java语言优雅地实现常用排序算法

    破阵子·春景 燕子来时新社,梨花落后清明. 池上碧苔三四点,叶底黄鹂一两声.日长飞絮轻. 巧笑同桌伙伴,上学径里逢迎. 疑怪昨宵春梦好,元是今朝Offer拿.笑从双脸生. 排序算法--最基础的算法,互 ...

随机推荐

  1. 网络层和arp协议

    1:arp协议功能:获取mac地址 ----------------------在同一个局域网:发送端mac  接收端mac(FF:FF:FF:FF:FF:FF:FF) 源IP  目标IP  数据 - ...

  2. Python爬虫入门教程 49-100 Appium安装+操作51JOB_APP(模拟手机操作之一)手机APP爬虫

    爬前准备工作 在开始安装Appium之前,你要先知道Appium是做什么的?Appium 是一个自动化测试开源工具,看到没,做测试用的,它有点类似Selenium,可以自动操作APP实现一系列的操作. ...

  3. ES 08 - 创建、查看、修改、删除、关闭Elasticsearch的index

    目录 1 创建index(配置mapping[映射]) 2 查看index 3 修改index 4 删除index 5 打开/关闭index 6 常见问题及解决方法 index相当于RDBMS(关系型 ...

  4. Koa 中的错误处理

    不像 express 中在末尾处注册一个声明为 (err, req, res, next) 中间件的方式,koa 刚好相反,在开头进行注册. app.use(async (ctx, next) =&g ...

  5. python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍

    目录 python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍.md 一丶字典 1.字典的定义 2.字典的使用. 3.字典的常用方法. python学习第八讲,python ...

  6. django-restframework 处理跨域问题

    django-restframework 处理跨域问题 一 前言 想要处理跨域问题,首先需要了解同源策略. 二 同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也 ...

  7. 一次快速改寫 SQL Server 高效查詢的範例

    最近線上系統突然出現匯出資料超過 10 筆時,查詢逾時的狀況,在仔細查找之後. 發現了問題原因,透過應用端與數據端兩邊同時調整,將查詢的效率提昇了約數百倍以上 首先,原本應用端的商務邏輯為每一分頁筆數 ...

  8. javascript小记四则:用JS写一个滚动横条文字,可以根据需要进行修改;

    网页上的一些广告文字,一直会滚动是怎么做到的,今天给大家演示下,非常简单,源码如下(本案例是在.net平台上,但HTML是通用的): <!DOCTYPE html> <html> ...

  9. Microsoft.Office.Interop.Excel 报错

    Microsoft.Office.Interop.Excel 报错 引用dll 在以下目录 C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop. ...

  10. 简单多播委托Demo

    namespace ConsoleApp4 { class Program { static void Main(string[] args) { Mum mum = new Mum(); Dad d ...