【JS面试向】选择排序、桶排序、冒泡排序和快速排序简介
新年伊始,又到了金三银四的时候了。面对前端越来越多的算法面试题,我简单的整理了一下几种比较常见的数组排序方式,分别介绍其基本原理和优劣势。(ps:才疏学浅,希望大家可以在issues下面指出问题)
选择排序
原理
选择排序从数组内遍历出最大值,加入新数组,将最大值从原数组中删除,重复上述操作,最后得出的新数组就是一个从大到小排序的数组了。
代码实现
/**
* params {number[]} list
* return {number[]}
*/
function sort(list) {
list = [...list]; // 最好不要对元素组操作
const newList = []; // 创建待返回的空数组
while(list.length) { // 当 list.length === 0 时,表示处理完毕
let min = Infinity; // 设最小值无穷大 或者 等于 list 中的任意位置都可
let minIndex; // 记录下最小值下标
list.forEach((el, index) => { // 对 list 循环,查找当前 list 最小值
if(el < min) {
min = el;
minIndex = index;
}
});
newList.push(list[minIndex]); // 将 最小值下标 对应的值 push 进数组
list.splice(minIndex, 1); // 从list内删除这个值
}
return newList
}
优劣
优点:
- 上手比较简单,比较符合人的正常思路逻辑。
缺点:
- 时间复杂度O(n^2),运算速度很慢,当数组元素个数比较多时,时间增速惊人。
桶排序
原理
桶排序顾名思义,就是准备好一些“桶”,然后将待排序的数组值一个个放入对应的“桶内”,全部元素放入”桶“后,然后展开”桶“就得到了排序完成的数组了。比如:当前需要排序的数组 [8, 3, 5, 9, 2, 3, 0, 8],我们可以准备一个长度为10的数组,每一项的值为0,我们对需要排序的数组开始便利,当我们遇到8时,我们将newList[8]内的0,加1,改成1;然后下一个3,我们将newList[3]内的0,加1,改成1...,处理完所有元素后,将newList便利输出就得到了排序好的数组了。当然了这里只是简单的对桶排序的介绍,真正的桶排序肯定比这个复杂。
代码实现
const list = [8, 3, 5, 9, 2, 3, 0, 8]; // 待排序数组 /**
* params {number[]} list
* return {number[]}
*/
function sort(list) {
const newList = Array.from({length: 10}).fill(0); // 创建 [0, 0, ..., 0] 的数组,长度为10
list.forEach(el => newList[el] += 1); // 把数组元素记录在 newList 上
return newList.reduce((pre, el, index) => { // 展开数组
for(let i = el; i; i--) {
pre.push(index)
}
return pre;
}, [])
}
优劣
优点:
- 时间复杂度只有O(m+n),计算效率高
缺点:
空间消耗比较大
需要提前知道最大值,最小值
冒泡排序
原理
冒泡排序我先介绍说它的原理,你就明白它为什么叫冒泡排序了。有一个待排序的数组 [8, 3, 5, 9, 2, 3, 0, 8] ,需要由小到大排序。我们只需要把小的放在左边,大的放右边是不是就完成了排序呢?显然是的。将第一个 8 与 第二位 3 比较,8 大于 3,所以我们把8往右放,即将 8 与 3 更换位置,更换后的数组是 [3, 8, 5, 9, 2, 3, 0, 8] ,继续比较改变后的数组第二位 8 与 第三位 5 比较,8 大于 5,更换后的数组是 [3, 5, 8, 9, 2, 3, 0, 8],重复这样的操作,如果遇到相同或者当前数值小于后一位的则不需要改变,继续比较下一位即可。所以看这 8 的移动轨迹,像不像是一个气泡在往上冒,所以这个排序方法就叫冒泡排序。
代码实现
/**
* params {number[]} list
* return {number[]}
*/
function sort(list) {
list = [...list];
let length = list.length;
while(length--) {
for(let i = 0; i < length; i++) {
const current = list[i];
const next = list[i + 1];
if(current > next) {
[list[i], list[i + 1]] = [next, current];
}
}
}
return list;
}
优劣
优点:
- 没啥优点吧,我不清楚哈,欢迎赐教。
缺点:
- 时间复杂度O(n^2),计算慢。
快速排序
中心思想是用二分实现的快速排序,能够很快的完成排序任务,也是我比较推荐的一种排序方式。
原理
快速排序的优点就是速度快,为什么速度快呢?我先介绍一下快速排序的原理。选择一个基准值,一般选择数组的一个值,遍历数组,大的放右边,小的放左边,一样大的放中间(哈哈哈哈哈
【JS面试向】选择排序、桶排序、冒泡排序和快速排序简介的更多相关文章
- 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)
2013-08-22 14:55:33 八大排序方法汇总(选择排序-简单选择排序.堆排序,插入排序-简单插入排序.shell排序,交换排序-冒泡排序.快速排序,归并排序,计数排序). 插入排序还可以和 ...
- 【PHP数据结构】其它排序:简单选择、桶排序
这是我们算法正式文章系列的最后一篇文章了,关于排序的知识我们学习了很多,包括常见的冒泡和快排,也学习过了不太常见的简单插入和希尔排序.既然今天这是最后一篇文章,也是排序相关的最后一篇,那我们就来轻松一 ...
- 记数排序 & 桶排序 & 基数排序
为什么要写这样滴一篇博客捏...因为一个新初一问了一道水题,结果就莫名其妙引起了战斗. 然后突然发现之前理解的桶排序并不是真正的桶排序,所以写一篇来区别下这三个十分相似的排序辣. 老年菜兔的觉醒!!! ...
- python 排序 桶排序
算法思想: 桶排序将数组分到有限数量的桶里.然后每个桶里再分别排序(使用任何算法) 当要倍排序的数组内的数值时均匀分配的时候,桶排序使用线性时间O(n) 步骤: 根据最大值.最小值.桶内数据范围设定一 ...
- Python线性时间排序——桶排序、基数排序与计数排序
1. 桶排序 1.1 范围为1-M的桶排序 如果有一个数组A,包含N个整数,值从1到M,我们可以得到一种非常快速的排序,桶排序(bucket sort).留置一个数组S,里面含有M个桶,初始化为0.然 ...
- js常用的2中排序方法:冒泡排序和快速排序
冒泡排序:例如9 4 5 6 8 3 2 7 10 1 首先:9和4比较 4放前 4 9 5 6 8 3 2 7 10 1 4和5比较 4不动 4 9 5 6 8 3 2 7 10 1 ...
- java排序算法之冒泡排序和快速排序
总结一下Java排序算法,以便记忆. 各类排序的时间复杂度: 排序方法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) 空间复杂度 稳定性 复杂性 直接插入排序 O(n2)O(n2) O( ...
- js---数组排序法(冒泡排序;快速排序)
1.冒泡排序 原理:将数组的相邻两个元素进行比较,大的就往后移,小的往前,依次比较并且进行递减迭代. var arr =[54,36,89,1,3,5,2]; function sortArr(arr ...
- 使用 js 实现十大排序算法: 桶排序
使用 js 实现十大排序算法: 桶排序 桶排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
随机推荐
- @staticmethod和classmethod
之前一直搞不清楚这两个类方法有什么区别,今天着重学习了一下 @staticmethod是静态方法,不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样. class C(object): ...
- vue-cli+webpack+router+vuex---之vuex使用
有信心的可以去看官方的文档 vue 的官方文档有个显著的特点---代码粘贴不全 Vue中文站:cn.vuejs.org vue-router官方教程:router.vuejs.org/zh-cn vu ...
- python全栈开发 * 24 知识点汇总 * 180705
24 模块-------序列化一.什么是模块 模块:py文件就是一个模块.二.模块的分类:(1)内置模块 (登录模块,时间模块,sys模块,os模块)(2)扩展模块 (itchat 微信有关,爬虫,b ...
- python全栈开发 * 30知识点汇总 * 180713
30 re模块2一.正则表达式在线测试 在线测试工具 http://tool.chinaz.com/regex/(一).*?的用法: . 是任意字符 * 是取 0 至 无限长度 ? 是非贪婪模式.合在 ...
- 微信OAuth授权获取用户OpenId-JAVA(个人经验)【申明:来源于网络】
微信OAuth授权获取用户OpenId-JAVA(个人经验)[申明:来源于网络] 地址:https://my.oschina.net/xshuai/blog/293458
- F#周报2019年第3期
新闻 SAFE最近的活动 什么开源项目适合我们的奖学金受益者上手工作 布署SAFE应用至Google Cloud AppEngine Alea GPU:使用F#进行GPU编程 Rider 2018.3 ...
- InnoDB中锁的模式
Ⅰ.总览 S行级共享锁 lock in share mode X行级排它锁 增删改 IS意向共享锁 IX意向排他锁 AI自增锁 Ⅱ.锁之间的兼容性 兼 X IX S IS X × × × × IX × ...
- 实现mybash
任务内容 1.使用fork,exec,wait实现mybash 查找资料: fork函数 通过fork()系统调用我们可以创建一个和当前进程印象一样的新进程.我们通常将新进程称为子进程,而当前进程称为 ...
- 3、jeecg 笔记之 模糊查询
1.前言 jeecg 考虑到默认模糊查询的话,会增加系统压力,导致查询慢,本来系统就挺那啥的... 2.方式一之实体赋值 实体重新赋值查询,用 * %% * 实现,我们知道 sql 中通常使用 % 去 ...
- 墨刀联合有赞Vant组件库,让你轻松设计出电商原型
继上周新上线了简历模板之后,本周墨刀的原型模板库又欢喜地增添一名新成员! 有赞Vant组件库 (做电商的宝宝要捂嘴笑了) Vant 组件库是有赞前端团队开源的一套基于Vue的UI组件库,目前版本收 ...