【JS算法】 排序算法及性能汇总
目录
冒泡排序
选择排序
插入排序
快速排序
总结
冒泡排序
冒泡排序比较所有相邻的两个项,如果第一个比第二个大,则交换它们。
首先随机生成一个100000的数组
var array = Array.from({length:100000},val=>Math.ceil(Math.random()*100000))
然后利用冒泡排序算法
function bubbleSort(arr){for(let i=0;i<arr.length;i++){for(let j=0;j<arr.length-i-1;j++){if(arr[j]>arr[j+1]){let temp = arr[j]arr[j]=arr[j+1]arr[j+1]=temp}}}return arr}bubbleSort(array)
为了可以看算法消耗的时间,在函数前后加上:
console.time()bubbleSort(array)console.timeEnd()
用时44052ms
选择排序
选择排序算法是一种原址比较算法,找到数据结构中的最小值并将其放到第一位,接着找到第二小的值并将其放到第二位。
function selectionSort(arr) {let minIndex, temp;for(let i = 0; i < arr.length - 1; i++) {minIndex = i;for(var j = i + 1; j < arr.length; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}return arr;
}console.time()selectionSort(array)console.timeEnd()
用时13698ms,速度比冒泡算法快
插入排序
插入排序每次排一个数组项,以此方式构建最后的排序数组。假定第一项已经排序了,接着它和第二项进行比较,判断第二项是待在原位还是插到第一项之前呢。这样,头两项就已经正确排序了,接着和第三项比较(它是插入到第一、第二还是第三的位置呢),以此类推。
function insertionSort(arr) {let preIndex, current;// 我们认为arr[0]已经被排序,所以i从1开始for (let i = 1; i < arr.length; i++) {preIndex = i - 1;current = arr[i];while (preIndex >= 0 && arr[preIndex] > current) {arr[preIndex + 1] = arr[preIndex];preIndex--;}arr[preIndex + 1] = current;}return arr;
}
console.time()
insertionSort(array)
console.timeEnd()
耗时只有7394ms左右
快速排序
快速排序采用分而治之的方法,将原始数组分为比较小的数组。
(1)首先,从数组中选择一个值作为主元(pivot),也就是数组中间那个值
(2)创建两个指针(引用),左边一个指向数组第一个值,右边一个指向数组最后一个值,移动左指针直到我们找到一个比主元大的值,接着,移动右指针直到找到一个比主元小的值,然后交换他们,重复这个过程,知道左边指针超过了右边指针。这个过程将使得比主元小的值都排在主元之前,比主元大的值都排到了主元之后。这一步为划分(partition)。
(3)算法对划分后的小数组(较主元小的值组成的子数组,以及较主元大的值组成的子数组)重复之前的两个步骤,直至数组已完全排序。
function qSort(arr) {//声名并初始化左边的数组和右边的数组let left = [], right = [];// 使用数组第一个元素作为基准值let base = arr[0];//当数组长度只有1或者为空时,直接返回数组,不需要排序if (arr.length <= 1) return arr;//进行遍历for (let i = 1; i < arr.length; i++) {if (arr[i] <= base) {//如果小于基准值,push到左边的数组left.push(arr[i])} else {//如果大于基准值,push到右边的数组right.push(arr[i]);}}//递归并且合并数组元素return [...qSort(left), base, ...qSort(right)];}console.time()qSort(array)console.timeEnd()
耗时只有178ms!!!
总结
四种排序算法的比较,快速排序最好!
【JS算法】 排序算法及性能汇总相关推荐
- 排序算法--排序算法汇总
排序算法无疑是学习数据结构中的重点内容,本文将给出排序算法的汇总. 下面是具体的实现: #include<stdio.h> #include<stdlib.h> #includ ...
- js 实现2的n次方计算函数_JS中数据结构与算法---排序算法
排序算法的介绍 排序也称排序算法 (Sort Algorithm),排序是将 一组数据 , 依指定的顺序 进行 排列的过程 . 排序的分类 内部排序 : 指将需要处理的所有数据都加载 到 内部存储器( ...
- 用openAI写个js的排序算法(快速排序算法)
文章目录 一.生成JS快速排序算法 二.openai还会给出调用方法 一.生成JS快速排序算法 这是一个通用的 JavaScript 排序算法.它使用的是快速排序算法. function sort(a ...
- JAVA算法-排序算法
排序算法的介绍 排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程. 排序的分类: 1) 内部排序: 指将需要处理的所有数据都加载到内部存储器(内存)中进行 ...
- java 算法 排序算法_Java七种排序算法以及实现
Java常见七种排序算法以及实现 最近学习一些排序算法,怕自己以后忘记就打算整理起来供自己复习 萌新一枚学习Java没多久,以下仅供参考.如有错误希望大佬指正,欢迎大家在评论区交流探讨. 1.冒泡排序 ...
- php+堆排序算法,排序算法-堆排序-php
什么是堆排序 堆排序是我们经常使用的排序算法,它是利用堆的结构进行排序,堆是一种二叉树结构,并且它的父节点的值都大于子节点或者都小于子节点,如果大于,就是大顶堆,如果小于就是小顶堆. 根据堆的定义,我 ...
- 数据结构与算法 / 排序算法 / 堆排序
一.定义 借助堆结构实现的排序算法被称为堆排序. 二.过程说明 1.建堆 (1)方法1 原地建堆,对于数组来说,从前往后:对于树来说,从下向上. 将数组的第一个元素作为堆顶,第二个元素做向堆中插入数据 ...
- 数据结构与算法 / 排序算法(3)
一.桶排序(Bucket sort) 1.原理 将要排序的数据分到几个有序的桶里,每个桶里的数据再进行排序.桶内的数据排序完毕之后,再把桶里的数据依次取出,组成的序列就是有序的了. 2.原地排序? 属 ...
- 数据结构与算法 / 排序算法(2)
一.归并排序 1.原理 采用分治思想.将数组分成前后两部分,先将这两部分进行排序,然后再将二者合并即可. 2.原地排序? 不属于原地排序.因为每次合并都需要申请大小为 n 的临时数组用于保存合并之后的 ...
- 数据结构与算法 / 排序算法(1)
零.前言 1.常用的排序算法总结 排序算法种类 时间复杂度 是否基于比较 冒泡.插入.选择 O(n^2) √ 快排.归并 O(nlogn) √ 桶.计数.基数 O(n) × 2.算法的内存消耗 - 原 ...
最新文章
- Vmware的 管理工具概述
- 使用DWR实现自己主动补全 相似百度搜索框的自己主动显示效果
- myeclipse中配置spring xml自己主动提示
- 软件测试优先级策略,软件测试策略基础(转载)
- 医药行业的契约锁电子签章应用场景:印章统一管,核心业务在线签
- Alexa Top 1000000
- 虚拟机安装OpenGauss企业版
- 2019java面试(二)
- MyEclipse8.5开发环境配置,SVN插件安装问题(转载)
- 点陶极速版《隐私政策》
- Arduino白泽四足机器人——matlab逆运动学求解
- 使用html制作一个旅游网站
- 《Windows办公指南》魔改C:\Windows\System32\drivers\etc\hosts实现一个数据中心
- Android入门教程 (一) Android简介和android studio安装
- 基于思科模拟器进行子网划分
- Windows无法格式化改卷,改卷已脱机, 请尝试首先向改卷分配驱动器号或路径使其联机
- css 设置div的宽度根据内容自适应
- 文件共享总结中篇-Linux服务器文件共享
- 教python的app_Python教学
- htc 10 t版最新ruu t-mobile htc 10最新版,可用联通volte 可修复基带丢失