一起来快排吧 | 数组排序

简介: 数组快速排序(快排)也算是前端面试的经典入门问题了,作为一个前端程序员掌握快排技能也是必须滴~

前言


数组快速排序(快排)也算是前端面试的经典入门问题了,作为一个前端程序员掌握快排技能也是必须滴~


数组快排是二分法原理的经典应用,不熟悉二分法的同学可以看看胡哥的另一篇文章二分查找的原理及实现


快排的原理:


  1. 混乱数组nums中,选取最中间的midIndex


  1. 遍历数组nums中的每一个元素,与中间值nums[midIndex]比较,如果大则放入右侧数组中right = [],如果小,则放入左侧数组中left = [];


  1. 针对leftright数组再次调用排序函数,知道leftright数组长度为空;


  1. 将结果返回即可: [left的排序结果, nums[midIndex], right的排序结果]。


Up Code ~ 上代码 ~


/**
 * @method quickSort
 * @description 数组排序 - 快排、二分法
 * @param nums number[]
 * @returns number[]
 */
function quickSort(nums: number[]): number[] {
  // 获取数组的长度
  const len = nums.length;
  // 临界点判断,数组长度为0,直接返回
  if (len === 0) {
    return [];
  }
  // 获取nums元素之间的中间索引midIndex
  const midIndex = Math.floor(len / 2); // 这里是向下取整
  // 每次nums的中间值
  const midValue = nums[midIndex];
  // 定义left,专门接收所有 < midValue 的值
  let left: number[] = [];
  // 定义right,专门接收所有 > midValue 的值
  let right: number[] = [];
  // 遍历nums
  for (let i = 0; i < len; i++) {
    // 注意这里的处理 - 中间值直接跳过,后面拼接的时候直接用
    if (i === midIndex) continue;
    // 比midValue大的右挪,放入right
    if (nums[i] > midValue) {
      right.push(nums[i]);
    }
    // 比midValue小于/等于的左挪,放入left
    if (nums[i] <= midValue) {
      left.push(nums[i]);
    }
  }
  // 做优化处理,left、right长度为1时,就没有必要继续向下处理了
  if (left.length > 1) {
    left = quickSort(left);
  }
  if (right.length > 1) {
    right = quickSort(right);
  }
  // 拼接数组返回
  return [
    ...left,
    midValue,
    ...right
  ]
}


功能测试:


const nums: number[] = [4, 2, 1, 9, 9, 8, 3, 5, 6, 7];
// 调用
const newNums = quickSort(nums);
// 打印结果
console.log(nums); // [4, 2, 1, 9, 9, 8, 3, 5, 6, 7]
console.log(newNums); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 9]


快排的算法复杂度


空间复杂度:O(n)O(n)O(n)


时间复杂度:外层for循环O(n)O(n)O(n),内部递归时都是二分之一处理

O(logn)O(logn)O(logn),整体的时间复杂度是 O(nlogn)O(nlogn)O(nlogn)



相关文章
|
5月前
|
缓存 NoSQL Java
Java 项目实操高并发电商系统核心模块实现从基础到进阶的长尾技术要点详解 Java 项目实操
本项目实战实现高并发电商系统核心模块,涵盖商品、订单与库存服务。采用Spring Boot 3、Redis 7、RabbitMQ等最新技术栈,通过秒杀场景解决库存超卖、限流熔断及分布式事务难题。结合多级缓存优化查询性能,提升系统稳定性与吞吐能力,适用于Java微服务开发进阶学习。
174 0
|
缓存 测试技术 API
解锁开源模型高性能服务:SGLang Runtime 应用场景与实践
SGLang 是一个用于大型语言模型和视觉语言模型的推理框架。
|
JavaScript Java 测试技术
基于SpringBoot+Vue的考试管理系统的详细设计和实现
基于SpringBoot+Vue的考试管理系统的详细设计和实现
107 0
|
应用服务中间件 nginx
Nginx隐藏版本号
修改nginx.conf配置文件 nginx配置文件里增加 server_tokens off;server_tokens作用域是http server location语句块server_tokens默认值是on,表示显示版本信息,设置server_tokens值是off,就可以在所有地方隐藏nginx的版本信息。
5801 0
|
存储 缓存 负载均衡
基于springboot+Redis的前后端分离项目(一)-【黑马点评】
(一)前言 黑马点评项目是前后端分离项目,前端部署在nginx服务器上,后端部署在tomcat上,具体将实现以下功能。 短信登录 这一块我们会使用redis共享session来实现。 商户查询缓存 通过学习,我们会理解缓存击穿,缓存穿透,缓存雪崩等问题。 优惠卷秒杀 通过学习,我们可以学会Redis的计数器功能, 结合Lua完成高性能的redis操作,同时学会Redis分布式锁的原理,包括Redis的三种消息队列。 附近的商户 我们利用Redis的GEOHash来完成对于地理坐标的操作。
2156 0
|
关系型数据库
MySQL 8.0 主从复制性能提升
MySQL的并行复制,从5.6开始,经过几代的改进,终于在性能上有了不小的提升。 * MySQL 5.6 该版本开始提供并行复制功能,但是5.6的并行复制是schema级别的,所以只有binlog的row event操作的是不同的schema对象,且没有DDL和Foreign Key依赖的情况下,才能实现并行复制。
2520 0
|
JavaScript 前端开发 Windows