快速排序及sort的理解

2023-11-10

快速排序
快速排序的思想:
 (1)在数据集中,选择一个元素作为"基准"
 (2)所有小于“基准”的元素都移动到“基准”左边,所有大于“基准”的元素都移动到“基准”右边
 (3) 对"基准"左右两边的子集,递归地重复(1)和(2)直到所有子集的长度都只有1个时停止
var nums = [85,24,63,45,45,17,31,96,50]

var fastSort = function(nums){        
    let len = nums.length 
    if(len < 2){
        return nums
    }
    let _mi = parseInt((len -1 )/2)
    
    let middle = nums.splice(_mi, 1)[0]
    let left = []
    let right = []        
    nums.forEach(item => {
        if(item > middle){
            right.push(item)
        }else {
            left.push(item)
        }
    });        
    return fastSort(left).concat([middle],fastSort(right))
}


let res = fastSort(nums)
console.log(":::",res);

sort的排序时间比快速排序还要快
在这里插入图片描述

sort排序
sort()在元素组上进行排序,不产生副本,并且返回值是对数组的引用

V8中的sort并不是单一的一种排序方法,而是根据数组长度来选择具体的方法,
当数组小于等于22,选择插入排序,大于22则远着快速排序
如果调用sort()方法时候没有使用参数,将按字母顺序对数组中的元素进行排序(按照ASCII排序,首先应该将数组的元素都转成字符串(如有必要),以便进行比较)

如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字
1. (a,b) = >  a -b  (升序)       ......  a是后面的数,如果a<b  返回小于0的数,交换位置
2. (a,b) = >  b -a  (降序)

做一道题:
给定一组非负整数nums, 重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数
例1: nums = [10,2] 输出: ‘210’
例2: nums = [3,30,34,5,9] 输出: ‘9533430’

先来捋一捋思路
1. 我们知道sort是根据ASCII比较的,所以在比较的时候可以将每个元素转为字符串.toString\()
2.  按照ASCII降序排列
3. “30” 的ASCII 大于 "3"  所以在排序的位置上  [30,3 ] 这样是降序,然而[3,30]组成的数要大于[30,3] 
4. 所以我们可以比较 am = a.toString() + b.toString()  //  303
bm = b.toString() + a.toString()   // 330
5. 我们知道sort内部若返回小于0的数,则需要交换位置,显然 [5,9]  "59"  < "95" 需要交换位置
即 return “ba” - "ab" 也就是  return  bm - am
6. 代码如下
var largestNumber = function(arr){
	arr.sort((a,b)=>{
	  let am = a.toString() + b.toString() 
	  let bm = b.toString() + a.toString()
	  return  parseInt(bm) - parseInt(am) 
	})
	return arr.join("")
}

参考文献

深入解析V8中sort的工作原理
快速排序(Quicksort)的Javascript实现

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速排序及sort的理解 的相关文章

  • 浏览器兼容性测试工具

    相关连接 浏览器兼容性概述 目录 一 浏览器兼容性测试工具 1 0 IETester 免费 exe 1 1 SuperPreview 收费 exe 1 2 Adobe Browserlab 在线测试 1 3 BrowserStack 在线测

随机推荐

  • 从HTTP 2.0想到的关于传输层协议的一些事

    0 HTTP协议的历史我也不知道 1 关于HTTP 2 0收到了订阅的邮件 头版是说HTTP 2 0的内容 我本人不是很关注HTTP这一块儿 但是闲得无聊时也会瞟两眼的 HTTP 2 0的最大改进我觉得有两点 第一 新增了帧层 帧层的好处在
  • ThinkPHP3.2微信JSSDK签名配置config信息

    ThinkPHP3 2 controller代码 微信jssdk踩坑记 必须在服务器部署才有用 1 配置js接口安全域名不要加http 等 大坑 2 用appid和appsecret发起请求换取access token并将其全局缓存 3 用
  • 发布自己写的python包(得瑟)

    如何把自己写的包发布到pipy给别人用呢 网上一堆教程 众所周知网上教程都比较长 得耐心看完 学会了消化之后变成自己的了记录一下 第一步包的目录结构 抄作业就完了 第二步设置setup py 有个for human的模板 老哥起名也是幽默
  • adb shell dumpsys 使用命令和来源

    一 概述 adb shell dumpsys 在Android开发中经常要用到 平时都是零碎的积累 用到什么的时候就 记录下来 最近看了一些资料 发现可以汇总所有的命令 当带某个参数的时候 就可以查看具体 的信息 本篇文章中还讲解了如何去找
  • 【二维费用的完全背包问题】

    前言 简单写一下算法设计与分析这门课的一次实验 原题要求是用0 1背包来做 但是老师要求用完全背包来做 一 完全背包与0 1背包有什么区别 0 1背包 顾名思义对于每件物品只能拿1次或者0次 而完全背包对于每件物品的拿取没有次数限制 二 二
  • beyond compare破解方法

    BeyondCompare4相关操作 1 修改文件C Program Files Beyond Compare 4 BCUnrar dll 这个文件重命名或者直接删除 2 将以下操作保存为bat文件 然后双击运行即可 reg delete
  • java多态-对象多态

    对象多态 动态绑定 动态连接 package com leoworld polymorphism 多态的成员访问特点 A 成员变量 编译看左边 运行看左边 B 成员方法 编译看左边 运行看右边 为什么呢 因为成员方法有重写 而变量没有 C
  • 计算机dvd驱动错误,修正:一个错误发生在弹出的CD/DVD驱动器在Windows 10

    如果您使用的是可移动媒体 比如DVD或USB驱动器 有时您可能会在从系统中删除或弹出它时遇到麻烦 通常 Windows会拒绝当前正在使用的驱动器的请求 这意味着你应该首先关闭程序 应用程序 进程使用驱动器上的内容 然后你应该继续试着弹出驱动
  • 【Software Engineering】【期末复习知识点】【2023春】【仅供参考】

    文章目录 类型 总分占比 出勤 10 平时作业 2 5 10 期中考试 10 期末考试 70 附加分 提问加分 题型 题量 分值 预测 选择 15 2 填空 5 2 软件工程方法学 名词解释 5 2 软件危机 软件生命周期 简答 3 5 综
  • html中表单form的语法结构以及释义

    1 form属性
  • Redis command timed out nested exception is io.lettuce.core.RedisCommandTimeoutException

    报错如下 ERROR org springframework dao QueryTimeoutException Redis command timed out nested exception is io lettuce core Red
  • CSS3 2D转换之位移(translate)、旋转(rotate)、缩放(scale)以及设置旋转和缩放的中心点

    2D转换概述 2D转换可以实现元素的位移 旋转 缩放等效果 2D转换的分类有 移动 translate 旋转 rotate 缩放 scale 2D转换之translate 2D移动translate可以改变元素在页面中的位置 类似定位 移动
  • Eigen:C++中Eigen库的安装与学习

    1 下载地址 http eigen tuxfamily org index php title Main Page 进入上边官方网站进行下载如下所示 找到自己需要的版本下载即可 我下载的是3 3 8 右边的zip 2 解压配置即可 找到你下
  • Kafka配置与使用

    Kafka依赖于zookeeper 因此先配置zookeeeper zookeeper配置 修改 opt bigdata zookeeper conf zoo cfg dataDir data zookeeper 配置zookeeper数据
  • Java实现通过证书访问Https请求

    创建证书管理器类 import java io FileInputStream import java security KeyStore import java security cert CertificateException imp
  • 记录-常见算法的收集

    1 快速排序 找到基准点的位置 既不浪费空间又可以快一点的排序算法 如 6 1 2 7 9 3 4 5 10 8 这10个数进行排序 首先找到一个数作为基准点 一个参照数 为了方便 让第一个数6作为基准点 然后将这个序列中所有比基准数大的数
  • JQ工具2

    JQ工具2 开发工具与关键技术 VS JQ 作者 唐文坚 撰写时间 2020 10 17 jQuery extend deep target object1 objectN 概述 用一个或多个其他对象来扩展一个对象 返回被扩展的对象 如果不
  • C语言经典100例题(47)--宏#define命令练习(2)

    目录 题目 问题分析 代码 运行结果 题目 宏 define命令练习 2 问题分析 如果我们在 define的宏定义的内容过长时 我们的编译器中一行放不下 我们还可以加入续行符 也就是 来进行换行 是否一定需要使用换行符呢 答案是肯定的 如
  • 数组中最大最小值(C语言实现)

    题目描述 从键盘输入n n从键盘输入 n lt 100 个数存放在数组中 输出其中的最大数和最小数及他们对应的下标 输入说明 输入包含2行 第一行只有1个数字表示n 第二行有连续n个数字 其间用半角空格间隔 输出说明 输出只有1行 顺次输出
  • 快速排序及sort的理解

    快速排序 快速排序的思想 1 在数据集中 选择一个元素作为 基准 2 所有小于 基准 的元素都移动到 基准 左边 所有大于 基准 的元素都移动到 基准 右边 3 对 基准 左右两边的子集 递归地重复 1 和 2 直到所有子集的长度都只有1个