JS 排序学习记录

排序

1、快速排序

快速排序(Quick Sort)是一种常用的排序算法,其原理基于分治策略。快速排序的基本思想是通过选择一个基准元素(pivot),将待排序序列分割成两部分,一部分所有元素小于等于基准元素,另一部分所有元素大于等于基准元素,然后对这两部分分别进行递归排序,最终得到有序序列。

具体步骤如下:

  1. 选择基准元素:从待排序序列中选择一个元素作为基准元素(通常选择第一个或最后一个元素)。

  2. 分割操作:通过一趟排序,将待排序序列分割成两部分,使得左边的元素都小于等于基准元素,右边的元素都大于等于基准元素。在分割过程中,可以使用两个指针(称为i和j),分别从序列的两端开始,然后向中间移动,直到i遇到大于基准元素的元素,j遇到小于基准元素的元素,然后交换这两个元素,重复这个过程直到i和j相遇。

  3. 递归排序:对基准元素左右两部分的子序列分别进行递归排序,直到每个子序列只包含一个元素或为空。

快速排序的平均时间复杂度为O(nlogn),其中n是待排序序列的长度。它是一种原地排序算法,不需要额外的空间开销。然而,最坏情况下的时间复杂度为O(n^2),即当待排序序列已经有序或近乎有序时。为了改进最坏情况下的性能,可以采用随机选择基准元素或者三数取中法来选择基准元素。

// 快速排序
const quickSort = (nums) => {// 以中间值作为标准。if (nums.length <= 1) return nums;const mid = Math.floor(nums.length / 2), aim = nums.splice(mid, 1)[0];// console.log(aim, mid);let left = [], right = [];
​for (let i = 0; i < nums.length; i++) {const ele = nums[i];if (ele > aim) {right.push(ele)} else {left.push(ele);}}// console.log(left, right, aim);return quickSort(left).concat([aim], quickSort(right))
}
​
​
const arr = [2, 34, 21, 23, 44, 9]
console.log(quickSort(arr));

2、归并排序

归并排序(Merge Sort)是一种基于分治策略的排序算法,其原理是将待排序序列不断地分割成较小的子序列,然后将这些子序列合并成一个有序序列。

具体步骤如下:

  1. 分割操作:将待排序序列递归地分割成两个子序列,直到每个子序列只包含一个元素或为空。

  2. 合并操作:将分割后的子序列两两合并,通过比较元素的大小,按顺序将它们合并成一个有序序列。重复这个过程,直到所有子序列合并成一个完整的有序序列。

在合并操作中,需要创建一个临时数组来存储合并后的有序序列,然后按照顺序从两个子序列中选择较小的元素放入临时数组中,直到一个子序列中的所有元素都被选择完毕,然后将另一个子序列中剩余的元素依次放入临时数组中。

归并排序的时间复杂度是O(nlogn),其中n是待排序序列的长度。它是一种稳定的排序算法,不会改变相等元素的相对顺序。归并排序的缺点是需要额外的空间来存储临时数组,空间复杂度为O(n)。然而,由于归并排序的递归特性,其空间复杂度可以通过优化算法实现降低到O(1)。

// 归并排序
const mergeSort = (nums) => {// 分割操作:将待排序序列递归地分割成两个子序列,直到每个子序列只包含一个元素或为空。if (nums.length < 2) return nums;const mid = Math.floor(nums.length / 2)const left = nums.slice(0, mid);const right = nums.slice(mid)// 合并操作:将分割后的子序列两两合并,通过比较元素的大小,按顺序将它们合并成一个有序序列。重复这个过程,直到所有子序列合并成一个完整的有序序列。const merge = (leftArr = [], rightArr = []) => {let arr = [];while (leftArr.length && rightArr.length) {arr.push(leftArr[0] < rightArr[0] ?leftArr.shift():rightArr.shift())}return arr.concat(leftArr, rightArr);}return merge(mergeSort(left), mergeSort(right))
}
const arr = [2, 34, 21, 23, 1, 44, 9]
console.log(mergeSort(arr));

3、插入排序

插入排序(Insertion Sort)是一种简单直观的排序算法,其原理是将待排序序列分为已排序和未排序两部分,然后从未排序部分中选择一个元素,插入到已排序部分中的正确位置,使得已排序部分仍保持有序。

具体步骤如下:

  1. 从第一个元素开始,认为该元素已经被排序。

  2. 取出未排序部分的第一个元素,在已排序部分中从后向前扫描,找到该元素应该插入的位置。

  3. 将已排序部分中该位置以后的所有元素后移一位,然后将该元素插入到正确的位置。

  4. 重复步骤2-3,直到所有元素都被插入到已排序部分中。

在插入排序过程中,为了将一个元素插入到正确的位置,需要比较它和已排序部分中的元素大小。如果已排序部分中的元素比它大,则将该元素后移一位,否则将该元素插入到该位置。这样,每次插入一个元素后,已排序部分的长度增加1,未排序部分的长度减少1,最终将所有元素按照从小到大的顺序插入到已排序部分中。

插入排序的时间复杂度取决于输入序列的初始状态,最好情况下时间复杂度为O(n),即输入序列已经有序,每个元素只需要比较一次。最坏情况下时间复杂度为O(n^2),即输入序列是逆序的,每个元素需要比较n-1次。平均情况下时间复杂度为O(n^2)。插入排序是一种稳定的排序算法,相等元素的相对顺序不会改变。它的空间复杂度为O(1),不需要额外的空间来存储数据。

// 插入排序。
const insertSort = (nums) => {const len = nums.length;for (let i = 1; i < len; i++) {const ele = nums[i];let j = i - 1;while (j >= 0 && nums[j] < ele) {nums[j + 1] = nums[j]j--;}nums[j + 1] = ele;}return nums;
}
const arr = [2, 34, 21, 23, 1, 44, 9]
console.log(insertSort(arr));

4、冒泡排序

冒泡排序(Bubble Sort)是一种简单直观的排序算法,其原理是多次遍历待排序序列,每次比较相邻的两个元素,如果它们的顺序不正确,则交换这两个元素的位置,直到整个序列有序。

具体步骤如下:

  1. 从序列的第一个元素开始,依次比较相邻的两个元素,如果它们的顺序不正确,则交换它们的位置。

  2. 继续遍历序列,重复上述操作,直到最后一个元素,此时最后一个元素已经排好序。

  3. 对除最后一个元素外的所有元素重复上述操作,直到整个序列有序。

在冒泡排序过程中,每次遍历都会将当前未排序部分的最大元素“浮”到未排序部分的最后,因此称为“冒泡”。通过多次遍历,每次将未排序部分的最大元素放置到正确的位置,最终得到整个序列有序。

冒泡排序的时间复杂度为O(n^2),其中n是待排序序列的长度。它是一种稳定的排序算法,相等元素的相对顺序不会改变。冒泡排序的缺点是排序速度较慢,不适合处理大规模数据。

const bubbleSort = (nums) => {for (let i = 0; i < nums.length - 1; i++) {for (let j = 0; j < nums.length - 1 - i; j++) {if (nums[j + 1] < nums[j]) {const temp = nums[j];nums[j] = nums[j + 1];nums[j + 1] = temp;}}}return nums;
}
const arr = [2, 34, 21, 23, 1, 44, 9]
console.log(bubbleSort(arr));

5、选择排序

选择排序(Selection Sort)是一种简单直观的排序算法,其原理是每次从待排序序列中选择最小(或最大)的元素,将其放置在已排序部分的末尾(或开头),直到整个序列有序。

具体步骤如下:

  1. 在未排序部分中找到最小(或最大)的元素。

  2. 将该最小(或最大)元素与未排序部分的第一个元素交换位置,将其放置在已排序部分的末尾(或开头)。

  3. 扩大已排序部分的范围,继续执行步骤1-2,直到整个序列有序。

在选择排序的每一次遍历中,都会确定一个元素的最终位置。通过多次遍历,每次选择未排序部分的最小(或最大)元素放置到已排序部分的末尾(或开头),最终得到整个序列有序。

选择排序的时间复杂度为O(n^2),其中n是待排序序列的长度。无论输入序列的初始状态如何,每次遍历都需要找到最小(或最大)元素,因此需要进行n-1次遍历。选择排序是一种不稳定的排序算法,相等元素的相对顺序可能会发生改变。选择排序的优点是简单易实现,不需要额外的空间,只需要进行元素的比较和交换即可。然而,选择排序的缺点是每次遍历都需要找到最小(或最大)元素,效率相对较低,不适合处理大规模数据。

const selectSort = (nums) => {for (let i = 0; i < nums.length - 1; i++) {let minIndex = i;for (let j = i + 1; j < nums.length - 1; j++) { // 选择最小值的索引if (nums[minIndex] > nums[j]) {minIndex = j;}}let temp = nums[i];nums[i] = nums[minIndex];nums[minIndex] = temp;}return nums;
}
const arr = [2, 34, 21, 23, 1, 44, 9]
console.log(bubbleSort(arr));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/195930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数实融合!低代码推动工业数字化转型走“深”向“实”

当下&#xff0c;“数字化、智能化”已经不再是新鲜词。毕竟&#xff0c;在早几年前就已经有企业喊出大举进军数字化的口号&#xff0c;轰轰烈烈的数字化转型运动也持续了很长一段时间&#xff0c;有一些业内人士甚至判断“如今的企业数字化已经走过了成熟期&#xff0c;来到了…

使用群晖Docker搭建HomeAssistant并实现异地公网访问家中智能设备

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 使用群晖Docker搭建HomeAssistant并实现异地公网访问 文章目录 使…

Shopee买家通系统内置防指纹技术可解决多账号管理操作

为了解决多账号管理的难题&#xff0c;我们发现了一款强大的利器——Shopee买家通系统&#xff0c;它为我们提供了便捷而高效的辅助操作。这款系统基于先进的指纹浏览器技术开发&#xff0c;实现了全自动化的操作&#xff0c;让多账号管理变得轻而易举。 Shopee买家通系统内置了…

element-ui upload组件中将file文件数据转成二进制流数据格式

方法一 handleBeforeUpload (file)const reader new FileReader()reader.readAsArrayBuffer(file)reader.onload async function (theFile) {const binary new Blob([theFile.target.result]) // 转成二进制流数据 即binary数据格式}}方法二 const aBlob new Blob([file],…

霍尔传感器的分类

霍尔传感器分为线型霍尔传感器和开关型霍尔传感器两种。 &#xff08;一&#xff09;开关型霍尔传感器由稳压器、霍尔元件、差分放大器&#xff0c;斯密特触发器和输出级组成&#xff0c;它输出数字量。开关型霍尔传感器还有一种特殊的形式&#xff0c;称为锁键型霍尔传感器。 …

有关ADW400环保监测模块的详细介绍-安科瑞 蒋静

1 概述 ADW400 环保监测模块主要用于计量低压网络的三相有功电能&#xff0c;同时可选择最大四个回路的电流输入&#xff0c;具有 RS485 通讯和 470MHz 无线通讯功能&#xff0c;方便用户进行用电监测、集抄和管理。可灵活安装于配电箱内&#xff0c;实现对不 同区域和不同负荷…

深入探讨网络抓取:如何使用 Scala 和 Dispatch 获取 LinkedIn 图片

网络抓取是一种从互联网上获取数据的技术&#xff0c;它可以用于各种目的&#xff0c;例如数据分析、信息检索、竞争情报等。网络抓取的过程通常包括以下几个步骤&#xff1a; 发送 HTTP 请求到目标网站解析响应的 HTML 文档提取所需的数据存储或处理数据 在本文中&#xff0…

【1】基于多设计模式下的同步异步日志系统-项目介绍

1. 项目介绍 本项⽬主要实现⼀个日志系统&#xff0c; 其主要支持以下功能: • 支持多级别日志消息 • 支持同步日志和异步日志 • 支持可靠写⼊日志到控制台、文件以及滚动文件中 • 支持多线程程序并发写日志 • 支持扩展不同的日志落地⽬标地 2. 开发环境 • CentOS 7 • vs…

更新头像之后,如何通知对方头像已更新?

有两种方案&#xff1a; 第一种&#xff0c;A更新用户信息之后&#xff0c;发一条通知&#xff0c;通知其他好友&#xff0c;自己已经更新了用户信息&#xff0c;其好友收到通知之后&#xff0c;从服务器请求A的最新用户信息&#xff0c;刷新本地的用户缓存&#xff1b; 第二…

2、猴子吃桃问题。每天早上都吃了前一天剩下的一半零一个。

2、猴子吃桃问题。猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又多吃了一个&#xff0c;第二天早上又将剩下的桃子吃掉一半&#xff0c;又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个&#xff0c;到第 10天早上想再吃时&…

假设二叉树采用二叉链存储结构存储,设计一个算法,求先序遍历序列中第 k(1 <= k <= 二叉树中结点个数) 个结点的值。

问题描述&#xff1a;假设二叉树采用二叉链存储结构存储&#xff0c;设计一个算法&#xff0c;求先序遍历序列中第 k(1 < k < 二叉树中结点个数) 个结点的值。 分析&#xff1a; 考虑使用递归&#xff0c;题目说求先序序列第 k 个结点值&#xff0c;所以考虑使用先序递归…

Python 类:探索面向对象编程的奇妙世界

在 Python 中&#xff0c;类是一种强大的工具&#xff0c;可以让你更有组织地编写代码&#xff0c;实现真正的面向对象编程。 本篇文章将详细介绍 Python 类的知识点和使用方法&#xff0c;通过通俗易懂的解释和使用案例&#xff0c;帮助大家轻松理解并掌握类的奥秘。 1、类和…

封装带插槽的表格

子组件 <template><div><table><thead><tr><th v-for"col,colIndex in columns" :key"colIndex">{{ col.title }}</th></tr></thead><tbody v-if"instList.length >0"><tr …

Altair 电子可靠性解决方案

原文链接&#xff1a;Altair 电子可靠性解决方案

fpga rom 初始化文件的一些心得

目录 可能遇到的问题 问题 解决方案 rom的初始化 用途 文件类型 如何生成初始化文件 示例 Altera Xilinx 可能遇到的问题 问题 altera FPGA的rom找不到初始化文件&#xff0c;编译过程会提示类似的问题 Error(127001): Cant find Memory Initialization File or He…

运行游戏找不到x3daudio1_7.dll怎么解决?教你如何快速修复的教程

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“x3daudio1_7.dll丢失”。这个错误提示可能让我们感到困惑和烦恼&#xff0c;但是不用担心&#xff0c;本文将为您介绍x3daudio1_7.dll丢失的原因以及五种修复方法&#xff0c;帮助您解决这…

Nginx(缓存机制)

对于性能优化而言&#xff0c;缓存是一种能够大幅度提升性能的方案&#xff0c;因此几乎可以在各处都能看见缓存&#xff0c;如客户端缓存、代理缓存、服务器缓存等等&#xff0c;Nginx的缓存则属于代理缓存的一种。对于整个系统而言&#xff0c;加入缓存带来的优势额外明显&am…

【3】基于多设计模式下的同步异步日志系统-设计模式

详细介绍设计模式 单例模式 ⼀个类只能创建⼀个对象&#xff0c;即单例模式&#xff0c;该设计模式可以保证系统中该类只有⼀个实例&#xff0c;并提供⼀个访问它的全局访问点&#xff0c;该实例被所有程序模块共享。⽐如在某个服务器程序中&#xff0c;该服务器的配置信息存放…

Redis Desktop Manager for Mac:高效管理Redis数据的必备工具

Redis是一种快速、可扩展的内存数据库&#xff0c;被广泛应用于缓存、消息队列和实时分析等领域。而Redis Desktop Manager for Mac作为一款专为Mac用户设计的Redis桌面管理工具&#xff0c;为用户提供了高效便捷的方式来管理和操作Redis数据。 首先&#xff0c;Redis Desktop…

【已解决】xxljob连接报错HTTP 302(HTTP 401账号或密码错误)

目录 问题现象&#xff1a; 问题分析&#xff1a; 1、密码中的特殊字符。 2、密码长度问题。 解决方法&#xff1a; 拓展&#xff1a; 问题现象&#xff1a; 今天在生产环境使用xxljob任务调度来创建并执行任务时&#xff0c;出现了程序报错&#xff1a; 通过查询xxljob日志…