”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 像专业人士一样掌握排序算法

像专业人士一样掌握排序算法

发布于2024-11-13
浏览:573

正如我们一直在讨论不同的排序算法一样,今天我们将学习选择排序算法。一种排序算法,允许在内存受限的环境中实现尽可能少的交换。

目录

  1. 介绍
  2. 什么是选择排序算法?
  3. 选择排序如何工作?
    • 时间复杂度
    • 空间复杂度
  4. JavaScript 中的实现
  5. 解决 LeetCode 问题
  6. 结论

介绍

选择排序是一种简单而有效的排序算法,其工作原理是从列表的未排序部分中重复选择最小(或最大)元素,并将其移动到已排序部分的开头(或结尾)。重复这个过程,直到整个列表排序完成。在本文中,我们将深入研究选择排序算法的细节、它在 JavaScript 中的实现以及它在解决实际问题中的应用。

Mastering Sort Algorithm like a PRO

什么是选择排序算法?

选择排序算法是一种就地比较排序算法。它将输入列表分为两部分:

  1. 左端排序后的部分
  2. 右端未排序部分

该算法重复从未排序部分中选择最小元素,并将其与最左边的未排序元素交换,将已排序部分和未排序部分之间的边界向右移动一个元素。

选择排序如何工作?

让我们看一下使用数组 [64, 25, 12, 22, 11]:

的示例
  1. 初始数组:[64,25,12,22,11]
  • 排序部分:[]
  • 未排序部分:[64,25,12,22,11]
  1. 第一遍:
  • 在未排序部分中查找最小值:11
  • 将 11 与第一个未排序元素交换 (64)
  • 结果:[11, 25, 12, 22, 64]
  • 排序部分:[11]
  • 未排序部分:[25, 12, 22, 64]
  1. 第二遍:
  • 在未排序部分中查找最小值:12
  • 将 12 与第一个未排序元素 (25) 交换
  • 结果:[11, 12, 25, 22, 64]
  • 排序部分:[11, 12]
  • 未排序部分:[25, 22, 64]
  1. 第三遍:
  • 在未排序部分中查找最小值:22
  • 将 22 与第一个未排序元素 (25) 交换
  • 结果:[11, 12, 22, 25, 64]
  • 已排序部分:[11, 12, 22]
  • 未排序部分:[25, 64]
  1. 第四遍:
  • 在未排序部分中查找最小值:25
  • 25已经在正确的位置
  • 结果:[11, 12, 22, 25, 64]
  • 排序部分:[11, 12, 22, 25]
  • 未排序部分:[64]
  1. 最终通过:
    • 只剩下一个元素,它会自动位于正确的位置
    • 最终结果:[11,12,22,25,64]

数组现已完全排序。

时间复杂度

选择排序在所有情况下(最佳、平均和最差)的时间复杂度均为 O(n^2),其中 n 是数组中元素的数量。这是因为:

  • 外循环运行n-1次
  • 对于外循环的每次迭代,内循环运行 n-i-1 次(其中 i 是外循环的当前迭代)

这会导致大约 (n^2)/2 次比较和 n 次交换,从而简化为 O(n^2)。

由于这种二次时间复杂度,选择排序对于大型数据集效率不高。然而,它的简单性以及它使交换次数尽可能少的事实使其在某些情况下很有用,特别是当辅助内存有限时。

空间复杂度

选择排序的空间复杂度为 O(1),因为它对数组进行就地排序。无论输入大小如何,它只需要恒定数量的额外内存空间。这使得它具有内存效率,这在内存受限的环境中是有利的。

JavaScript 中的实现

这是选择排序算法的 JavaScript 实现:

function selectionSort(arr) {
  const n = arr.length;

  for (let i = 0; i 


我们来分解一下代码:

  1. 我们定义一个函数选择排序,它接受一个数组作为输入。
  2. 我们使用外循环 (i) 迭代数组,它表示已排序部分和未排序部分之间的边界。
  3. 对于每次迭代,我们假设第一个未排序元素是最小值并存储其索引。
  4. 然后我们使用内部循环 (j) 来查找未排序部分中实际的最小元素。
  5. 如果我们找到更小的元素,我们更新 minIndex。
  6. 找到最小值后,如有必要,我们将其与第一个未排序元素交换。
  7. 我们重复这个过程,直到整个数组排序完毕。

解决 LeetCode 问题

让我们使用选择排序算法来解决一道 Leetcode 算法问题。我们可以?

问题:对数组进行排序 [中]

问题:给定一个整数数组nums,按升序对数组进行排序并返回它。您必须在不使用任何内置函数的情况下以 O(nlog(n)) 时间复杂度和尽可能最小的空间复杂度解决问题。

做法::解决这个问题,我们可以直接应用选择排序算法。这涉及迭代数组,找到未排序部分中的最小元素,并将其与第一个未排序元素交换。我们重复这个过程,直到整个数组排序完成。

解决方案:

// This function sorts an array of integers in ascending order using the Selection Sort algorithm.
const sortArray = function (nums) {
  // Get the length of the input array.
  const n = nums.length;

  // Iterate through the array, starting from the first element.
  for (let i = 0; i 


这个解决方案直接应用了我们之前实现的选择排序算法。虽然它正确地解决了问题,但值得注意的是,由于选择排序的 O(n^2) 时间复杂度,该解决方案可能会超出 LeetCode 上大量输入的时间限制。下图显示该解决方案是正确的,但效率不高。

Mastering Sort Algorithm like a PRO

结论

总之,选择排序是一种简单直观的排序算法,可以很好地介绍排序技术的世界。它的简单性使其易于理解和实施,使其成为初学者有价值的学习工具。然而,由于其二次时间复杂度 O(n^2),它对于大型数据集效率不高。对于较大的数据集或性能关键型应用程序,首选更高效的算法,例如 QuickSort、MergeSort 或内置排序函数。



保持更新和联系

确保您不会错过本系列的任何部分,并与我联系以获得更深入的了解
关于软件开发(Web、服务器、移动或抓取/自动化)、数据的讨论
结构和算法,以及其他令人兴奋的技术主题,请关注我:

Mastering Sort Algorithm like a PRO

伟大的解决方案?

软件工程师|技术撰稿人 |后端、网络和移动开发人员? |热衷于打造高效且可扩展的软件解决方案。 #让连接?
  • GitHub
  • 领英
  • X(推特)

敬请期待并快乐编码??‍??

版本声明 本文转载于:https://dev.to/emmanuelayinde/mastering-sort-algorithm-like-a-pro-13p6?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSocke...
    编程 发布于2024-11-19
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-19
  • 尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    解决 PHP 中的 POST 请求故障在提供的代码片段中:action=''而不是:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"检查 $_POST数组:表单提交后使用 var_dump 检查 $_POST 数...
    编程 发布于2024-11-19
  • 如何在 MySQL 中查找子字符串的第二次或第三次出现?
    如何在 MySQL 中查找子字符串的第二次或第三次出现?
    在 MySQL 中查找子字符串的第二个或第三个索引在数据库中处理字符串时,通常需要定位位置特定子串的。如果简单的 LIKE 查询不够,您可能需要一种方法来精确识别该子字符串特定出现的索引。问题:您有一个空格-分隔的字符串,需要根据字符串的相对位置提取字符串的特定部分。例如,给定字符串“AAAA BB...
    编程 发布于2024-11-19
  • 拥有网站的主要好处
    拥有网站的主要好处
    网站可以为您的公司带来多种好处。它可以通过改善消费者关系和提高您的网络知名度来帮助您建立声誉。 除了提供展示您的商品或服务的舞台之外,它还保证与潜在客户的持续互动。一个既美观又易于使用的网站需要有效的网站建设。一般来说,网站是促进企业扩张和成功的有效工具。 介绍 在当前的数字时代,任...
    编程 发布于2024-11-19
  • 我们如何有效地约束 Go 1.18 泛型中的可索引类型?
    我们如何有效地约束 Go 1.18 泛型中的可索引类型?
    Go 1.18 泛型中的索引约束随着 Go 1.18 中泛型的引入,开发人员有机会实现适用于特定类型的算法类型。一种常见的要求是使用支持索引的类型,例如数组、切片、映射和字符串。可索引约束将类型参数限制为可索引类型,考虑使用以下带有并集的约束:type Indexable interface { ...
    编程 发布于2024-11-19
  • 除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为 bool 的主要场景:语句:if、w...
    编程 发布于2024-11-19
  • 为什么“go install”不能与 macOS 上的 zsh 一起使用?
    为什么“go install”不能与 macOS 上的 zsh 一起使用?
    macOS 中“Go install 无法与 zsh 配合使用”问题排查在 zsh 中遇到“go install”命令问题时,这一点至关重要验证您的配置设置。如果您已将“export PATH”行添加到 ~/.bash_profile 和 ~/.zshrc,但仍然遇到困难,则可能需要额外的配置。提供...
    编程 发布于2024-11-19
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-19
  • 如何高效检索 Go 字符串的最后一个字符?
    如何高效检索 Go 字符串的最后一个字符?
    检索 Go 字符串的最后一个字符在 Go 中,处理字符串时会出现一个常见的需求:从 Go 字符串中检索最后 X 个字符给定的字符串。虽然 string 包没有为此任务提供特定函数,但有一些有效的方法可以使用切片表达式来完成此任务。要获取字符串的最后 N 个字符,请使用以下切片表达式语法:string...
    编程 发布于2024-11-19
  • FastAPI:如何使用 Pydantic 声明查询参数
    FastAPI:如何使用 Pydantic 声明查询参数
    它大约三周前发布,是 FastAPI 最受期待的功能之一。至少当我们谈论 Pydantic Models FastAPI 时。 是的,我说的是使用 Pydantic 模型来映射查询参数的能力。 所以在这篇文章中,我将尽力向您展示一切?可以和?无法解决这个问题?: ?映射查询参数 要开...
    编程 发布于2024-11-19
  • 测试自动化工具:综合指南
    测试自动化工具:综合指南
    测试自动化工具简介 测试自动化工具已成为现代软件开发的重要组成部分,使团队能够简化测试流程并确保高质量的发布。在当今快节奏的开发环境中,手动测试已经跟不上持续集成和交付的速度。测试自动化工具允许团队自动执行重复任务,减少人为错误并腾出时间进行更复杂的测试工作。 为什么使用测试自动化工具? 自动化工...
    编程 发布于2024-11-19
  • 为什么在 AngularJS 中使用“controller as”语法?
    为什么在 AngularJS 中使用“controller as”语法?
    理解AngularJS的“controller as”语法简介AngularJS引入了一种定义控制器的新语法“controller as”,这引起了一些关注关于其目的的问题。本文旨在阐明此语法背后的基本原理及其优点。Controller as 语法“controller as”语法允许您实例化控制器...
    编程 发布于2024-11-19
  • 如何为单个 Go 项目定义 GOPATH?
    如何为单个 Go 项目定义 GOPATH?
    自动为各个项目定义GOPATH简介:在Go中管理依赖项和项目需要设置GOPATH 环境变量,但使用单个 GOPATH 的默认方法可能会导致冲突和冗余。本讨论探讨了在每个项目的基础上定义 GOPATH 的潜在解决方案。为每个项目定义 GOPATH:传统方法需要使用导出 GOPATH= 为每个项目手动设...
    编程 发布于2024-11-19
  • Google 财经小工具 API 弃用后如何检索股票行情?
    Google 财经小工具 API 弃用后如何检索股票行情?
    使用 Google Finance API 检索股票报价正如您所提到的,Google Finance Gadget API 不再可用。因此,通过这种方法访问股票报价不再可行。但是,还有其他资源提供类似的功能。一种替代方案是 Google Cloud Platform 的财务数据 API。此 API ...
    编程 发布于2024-11-19

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3