- 文章
- 基于后缀算术表达式的代码解析
- 基于AST的算数表达式解析
- Vscode Java 环境配置
- 纯前端实现图片的模板匹配
- 测试用例管理工具Luckyframe安装
- Vscode远程开发,本地翻墙神器
- 记前端手写方法
- Node 2020年新增功能
- yum-404-error
- react16特性:fiber reconciler解密
- cmd终端设置代理
- 前端面试题收集
- git子模块
- 算法-排序
- linux安装python-pyenv环境
- 开发人员良心工具
- 斐波拉契数列js实现
- 数组ArrayFlatten
- Docker安装部署taiga项目
- 极光推送RN集成
- docker-pm2发布node服务
- git-pull获取指定文件
- git获取第一次commit提交记录
- ReactNative项目选型设计
- Docker-Mysql8.0安装及初始化配置
- DDA算法
- ubuntu搭建shadowsocks服务
- React-Native 接入百度统计SDK
- docker-使用yum安装
- 前端入门篇
- CodePush尝试
- Markdown数学公式
- Mongoose踩坑路
- linux系统nvm指定版本安装
- linux安装nginx
- Vscode-Threejs代码智能提示
- linux常用命令
- 说明
算法-排序
一月 06, 2019冒泡算法
时间复杂度 $$ O(n^2) $$
首先我们可以看下冒泡排序的一个过程,以视频为例:
即冒泡排序
是:它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从 A 到 Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。
所以知道了冒泡排序的原理和排序流程,我们很容易就写出冒泡排序的算法:
function sort(arr) {
for (var i = 0; i < arr.length; i++) {
for (var j = 1; j < arr.length - i; j++) {
if (arr[j] < arr[j - 1]) {
var temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
}
return arr;
}
console.log(sort([1, 123, 2, 3, 12, 3, 123, 12, 3]));
// [ 1, 2, 3, 3, 3, 12, 12, 123, 123 ]
思考:如果上面代码中,里面一层循环在某次扫描中没有执行交换,则说明此时数组已经全部有序列,无需再扫描了。因此,增加一个标记,每次发生交换,就标记,如果某次循环完没有标记,则说明已经完成排序。
function sort(arr) {
for (var i = 0; i < arr.length; i++) {
var hasSwaped = false;
for (var j = 1; j < arr.length - i; j++) {
if (arr[j] < arr[j - 1]) {
var temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
hasSwaped = true;
}
}
if (!hasSwaped) {
return arr;
}
}
return arr;
}
选择排序
时间复杂度 $$ O(n^2) $$
首先观看选择排序的算法过程:
即选择排序
是:它依次地走访过要排序的元素列,找到其中最小的元素,放到左列
数组里,然后放进左列数组的元素与右侧最小元素对换位置及值。
function sort(arr) {
for (var i = 0; i < arr.length; i++) {
var min = arr[i];
var minIndex = i;
for (var j = i + 1; j < arr.length; j++) {
if (arr[j] < min) {
min = arr[j];
minIndex = j;
}
}
var temp = arr[i];
arr[i] = min;
arr[minIndex] = temp;
}
return arr;
}
console.log(sort([1, 123, 2, 3, 12, 3, 123, 12, 3]));
// [ 1, 2, 3, 3, 3, 12, 12, 123, 123 ]