js学习笔记之排序算法的原理及代码
冒泡排序
比较任何两个相邻的项,如果第一个比第二个大,则交换它们
重复这样的操作,直到排序完成,具体代码如下:
let arr = [67,23,11,89,45,76,56,99]
function bubbleSort ( data ) {
var temp = 0;
for ( var i = data.length ; i > 0 ; i -- ){
for( var j = 0 ; j < i - 1 ; j++){
if( data[j] > data[j + 1] ){
temp = data[j];
data[j] = data [j+1];
data[j+1] = temp;
}
}
}
return data;
}
console.log(bubbleSort(arr))
选择排序
找到数据结构中的最小值并 将其放置在第一位,接着找到第二小的值并将其放在第二位,以此类推。具体代码如下:
let arr = [67,23,11,89,45,76,56,99]
function selectionSort (data) {
let indexMin
for (let i = 0; i < data.length - 1; i++){
indexMin = i
for (var j = i; j < data.length; j++){
if(data[indexMin] > data[j]) {
indexMin = j
}
}
if (i !== indexMin){
let aux = data[i]
data[i] = data[indexMin]
data[indexMin] = aux
}
}
return data
}
console.log(selectionSort(arr))
插入排序
依次循环每个数组元素,对比当前数组元素在已经排好的数组元素中处于什么位置,并插入。具体代码如下:
let arr = [67,23,11,89,45,76,56,99]
function insertionSort( data ) {
var len = data.length;
for (var i = 1; i < len; i++) {
var key = data[i];
var j = i - 1;
while ( j >= 0 && data[j] > key) {
data[j + 1] = data[j];
j--;
}
data[j + 1] = key;
}
return data;
}
console.log(insertionSort(arr))
归并排序
把数组从中间拆分成左右两部分,然后把左右两部分再拆分,直到拆分的数组中只有一个元素。
拆分完后再将拆分的数组依次合并成有序数组,合并到最后会变成左右两个有序数组的合并。具体代码如下
const merge = (left, right) => {
    const result = []
    let il = 0
    let ir = 0
    while(il < left.length && ir < right.length) {
        if(left[il] < right[ir]) {
            result.push(left[il++]) // 这里的left[il++]是先进行取值运算left[il], 在进行自增运算il++
        } else {
            result.push(right[ir++])
        }
    }
    while (il < left.length) {
        result.push(left[il++])
    }
    while (ir < right.length) {
        result.push(right[ir++])
    }
    return result
}
const mergeSortRec = array => {
    if (array.length === 1) {
        return array
    }
    const mid = Math.floor(array.length / 2)
    const left = array.slice(0, mid)
    const right = array.slice(mid, array.length)
    return merge(mergeSortRec(left), mergeSortRec(right))
}
let arr = [5, 3, 2, 4, 1]
console.log(mergeSortRec(arr))
快速排序
在数组中选择一个基准值,所有小于基准的都放在左边,大于基准的都放在右边,再把左右两个数组同样处理,直到数组中只有一个元素为止
再依次合并排序完的所有数组,就得到了有序的数组,代码如下:
let arr = [67,23,11,89,45,76,56,99]
let quickSort = function(arr) { if (arr.length <= 1) { return arr } let pivot = arr.shift()
let left = []
let right = [] for (var i = 0; i < arr.length; i++){
if (arr[i] < pivot) {
left.push(arr[i])
} else {
right.push(arr[i])
}
console.log(left, right, 'aaa')
} return quickSort(left).concat([pivot], quickSort(right)) }
console.log(quickSort(arr))
js学习笔记之排序算法的原理及代码的更多相关文章
- STL学习笔记(排序算法)
		STL提供了好几种算法对区间内的元素排序.出来完全排序外,还支持局部排序. 对所有元素排序 void sort(RandomAccessIterator beg,RandomAccessIterato ... 
- TSPL学习笔记(3):排序算法练习
		快速排序 快排的详细介绍见,简单的说就是取输入序列中的首元素m,然后将除首元素m以外的其它元素分成两组,小于等于m的一组和大于m的一组.将3组元素组合成输入队列:小于等于m + m + 大于m. 下面 ... 
- 【转】Backbone.js学习笔记(二)细说MVC
		文章转自: http://segmentfault.com/a/1190000002666658 对于初学backbone.js的同学可以先参考我这篇文章:Backbone.js学习笔记(一) Bac ... 
- 2019-4-29 js学习笔记
		js学习笔记一:js数据类型 1:基本数据类型 number类型(整数,小数) String类型 boolean类型 NaN类型其实是一个nu ... 
- 一点感悟:《Node.js学习笔记》star数突破1000+
		写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ... 
- Java基础复习笔记基本排序算法
		Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ... 
- WebGL three.js学习笔记 6种类型的纹理介绍及应用
		WebGL three.js学习笔记 6种类型的纹理介绍及应用 本文所使用到的demo演示: 高光贴图Demo演示 反光效果Demo演示(因为是加载的模型,所以速度会慢) (一)普通纹理 计算机图形学 ... 
- ZooKeeper学习笔记(二)——内部原理
		zookeeper学习笔记(二)--内部原理 1. zookeeper的节点的类型 总的来说可以分为持久型和短暂型,主要区别如下: 持久:客户端与服务器端断开连接的以后,创建的节点不会被删除: 持久化 ... 
- js学习笔记:webpack基础入门(一)
		之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ... 
随机推荐
- starter自动转配流程以及@Import注解使用
			本文主要内容包括三个部分,第一部分主要介绍@Import注解的三种使用方法,第二部分主要介绍自定义starter的两种形式,第三部分主要介绍Springboot自动装配Bean的大致流程,第四部分主要 ... 
- 不会 Web 开发,也能让数据“动”起来的开源项目!
			本文面向有 Python 基础的小伙伴,有 Web 基础的更好 作者:HelloGitHub-吱吱 这里是 HelloGitHub 推出的<讲解开源项目>系列,今天要向小伙伴们介绍的是一个 ... 
- Windows平台安装RabbitMQ(亲测)
			一.下载安装包 https://www.rabbitmq.com/download.html 选择Windows下载 3.下载RabbitMQ安装包和运行环境Erlang安装包 (1)比对下载对应的版 ... 
- Pycharm破解版_安装从失败到成功
			前言: 入门学习的时候一直用的是社区版的,现在想换个专业版的玩玩. 本文使用的环境说明: win10系统 安装过pycharm社区版,已卸载 已安装python 3.8.5 (建议看完整篇文章后再自行 ... 
- Linux中的chkconfig
			chkconfig是用来查看开机自启动项目的命令.默认列出linux系统开机自启的项目.平时我们使用时习惯加上--list 从这个图中可以看到当前系统有哪些开机启动项目,就是红色框中的on. 那么怎么 ... 
- 01 JumpServer安装
			1.0.环境说明: 操作系统类型 主机名称 用户及密码 角色 eth0(Vmnet8) eth1(Vmnet1) 防火墙状态 selinux centos7.4 controlnode root:12 ... 
- 28、python3.7(windows)将ORACLE11gR2中的数据取出写入excel表
			28.1.下载python的离线扩展模块: 1.windows下python的离线扩展模块下载地址为: https://www.lfd.uci.edu/~gohlke/pythonlibs/ 提示: ... 
- 附加数据库出现  无法打开物理文件 操作系统错误 5:拒绝访问   SQL
			刚刚从公司的电脑上考到自己刚刚装好系统的笔记本上面,出现了问题: 无法打开物理文件 操作系统错误 5:拒绝访问 . 网上找了下解决方法: 找到需要导入的 mdf和ldf 修改它的权限为完全控制,不 ... 
- Pandas高级教程之:统计方法
			目录 简介 变动百分百 Covariance协方差 Correlation相关系数 rank等级 简介 数据分析中经常会用到很多统计类的方法,本文将会介绍Pandas中使用到的统计方法. 变动百分百 ... 
- 选择适合小企业的CRM软件
			随着信息时代的到来和客户掌握的信息变多,大多数企业开始从"以产品为中心"转变为"以客户为中心".为了适应市场的变化,许多企业开始使用客户关系管理软件来提高工作效 ... 
