js 前端常用排序算法总结
(冒泡排序、快排顺序、选择排序、插入排序、归并排序)
下面是前端比较常用的五个算法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 前端常用排序算法总结的更多相关文章
- JS实现常用排序算法—经典的轮子值得再造
关于排序算法的博客何止千千万了,也不多一个轮子,那我就斗胆粗制滥造个轮子吧!下面的排序算法未作说明默认是从小到大排序. 1.快速排序2.归并排序3.冒泡排序4.选择排序(简单选择排序)5.插入排序(直 ...
- javascript常用排序算法实现
毕业后,由于工作中很少需要自已去写一些排序,所以那些排序算法都忘得差不多了,不过排序是最基础的算法,还是不能落下啦,于是找了一些资料,然后用Javascript实现了一些常用的算法,具体代码如下: & ...
- Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法
Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...
- 转载部长一篇大作:常用排序算法之JavaScript实现
转载部长一篇大作:常用排序算法之JavaScript实现 注:本文是转载实验室同门王部长的大作,找实习找工作在即,本文颇有用处!原文出处:http://www.cnblogs.com/ywang172 ...
- Java 常用排序算法/程序员必须掌握的 8大排序算法
Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...
- 常用排序算法的python实现和性能分析
常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...
- 面试中常用排序算法实现(Java)
当我们进行数据处理的时候,往往需要对数据进行查找操作,一个有序的数据集往往能够在高效的查找算法下快速得到结果.所以排序的效率就会显的十分重要,本篇我们将着重的介绍几个常见的排序算法,涉及如下内容: 排 ...
- 常用排序算法java实现
写在前面:纸上得来终觉浅.基本排序算法的思想,可能很多人都说的头头是到,但能说和能写出来,真的还是有很大区别的. 今天整理了一下各种常用排序算法,当然还不全,后面会继续补充.代码中可能有累赘或错误的地 ...
- 我们一起来排序——使用Java语言优雅地实现常用排序算法
破阵子·春景 燕子来时新社,梨花落后清明. 池上碧苔三四点,叶底黄鹂一两声.日长飞絮轻. 巧笑同桌伙伴,上学径里逢迎. 疑怪昨宵春梦好,元是今朝Offer拿.笑从双脸生. 排序算法--最基础的算法,互 ...
随机推荐
- Python + PyQt5 实现美剧爬虫可视工具(二)
美剧<权力的游戏>终于开播最后一季了,在上周写了个简单的可视化美剧的爬虫软件来爬取美剧,链接:https://www.cnblogs.com/weijiutao/p/10614694.ht ...
- Egg.js 中入参的校验
日常作业中免不了频繁处理 GET/POST 的入参,你当然可以每个 action 中都重复地去做这些事情, 从 query 或 body 取出入参, 对可选的入参进行判空, 处理入参的类型转换, 对入 ...
- 五行Python代码教你用微信来控制电脑摄像头
如果说强大的标准库奠定了Python发展的基石,丰富的第三方库则是python不断发展的保证.今天就来通过itchart库来实现通过微信对电脑的一些操作. 一.安装库 安装itchat itchat ...
- jquery快速入门(三)
捕获内容和属性 1.DOM 操作 获得内容 - text().html() 以及 val() text() - 设置或返回所选元素的文本内容,如果不带值则是返回值,如果带值则是修改值,如:$('p') ...
- Thread之十:停止线程方法汇总
在上篇文章<多线程的使用——Thread类和Runnable接口>中提到中断线程的问题.在JAVA中,曾经使用stop方法来停止线程,然而,该方法具有固有的不安全性,因而已经被抛弃(Dep ...
- HTTP Get与Post的本质区别
作者:Larry链接:https://zhuanlan.zhihu.com/p/22536382来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. GET和POST是HTT ...
- WPF Geometry 添加Path数据
当图片转svg,svg转Xaml后,根据数据加载显示图片 DrawingImage: <DrawingImage x:Key="Image.Search"> <D ...
- Java 设置PDF文档背景色
一般生成的PDF文档默认的文档底色为白色,我们可以通过一定方法来更改文档的背景色,以达到文档美化以及保护双眼的作用. 以下内容提供了Java编程来设置PDF背景色的方法.包括: 设置纯色背景色 设置图 ...
- setTimeout传参 和 运行机制
1.setTimeout 传参数 setTimeout还允许添加更多的参数.它们将被传入推迟执行的函数(回调函数) 上面代码中,setTimeout共有4个参数.最后那两个参数,将在1000毫秒之后回 ...
- 电脑获取手机文件的一种方式(通过手机建立ftp)
1 打开手机热点. 2 手机需要安装es文件浏览器,在es浏览器首页有个远程管理(或在左侧网络功能下有个远程管理),打开即可启用手机目录下的ftp. 3 打开电脑按提示输入ftp站点.默认地址是手机热 ...