2. 选择排序

news2024/12/23 11:03:11

2.1 内存的工作原理

需要将数据存储到内存时,你请求计算机提供存储空间,计算机给你一个存储地址。

需要存储多项数据时,有两种基本方式——数组和链表。



2.2 数组和链表

有时候,需要在内存中存储一系列元素。

使用数组意味着所有待办事项在内存中都是相连的(紧靠在 一起的)。


现在假设你要添加第四个待办事项,但后面的那个抽屉放着别人的东西!

在这种情况 下,你需要请求计算机重新分配一块可容纳4个待办事项的内存,再将所有待办事项都移到那里。

同样,在数组中添加新元素也可能很麻烦。如果没 有了空间,就得移到内存的其他地方,因此添加新元素的速度会很慢。

一种解决之道是“预留座位”:即便当前只有3个待办事项,也请计算机提供10个位置,以防需要添加待办事项。这样,只要待办事项不超过10 个,就无需转移。

这是一个不错的权变措施,但它存在如下两个缺点:
你额外请求的位置可能根本用不上,这将浪费内存。你没有使用, 别人也用不了。
待办事项超过10个后,你还得转移。

对于这种问题,可使用链表来解决。


2.2.1 链表

链表中的元素可存储在内存的任何地方。

链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起。

在链表中添加元素很容易:只需将其放入内存,并将其地址存储到前一个元素中。

使用链表时,根本就不需要移动元素。


链表的优势在插入元素方面,那数组的优势又是什么呢?


2.2.2 数组

在需要读取链表的最后一个元素时,你不能直接读取,因为你不知道它所处的地址,必须先访问元素#1,从中获取元素 #2的地址,再访问元素#2并从中获取元素#3的地址,以此类推,直到访问最后一个元素。

需要同时读取所有元素时,链表的效率很高:你读取 第一个元素,根据其中的地址再读取第二个元素,以此类推。

但如果你需要跳跃,链表的效率真的很低。


数组与此不同:你知道其中每个元素的地址。

需要随机地读取元素时,数组的效率很高,因为可迅速找到数组的任何元素。


2.2.3 术语

数组的元素带编号,编号从0而不是1开始。

元素的位置称为索引 。


下面列出了常见的数组和链表操作的运行时间。


2.2.4 在中间插入

需要在中间插入元素时,数组和链表哪个更好呢?

使用链表时,插入元素很简单,只需修改它前面的那个元素指向的地址。

而使用数组时,则必须将后面的元素都向后移。如果没有足够的空间,可能还得将整个数组复制到其他地方!

因此,当需要在中间插入元素时,链表是更好的选择。


2.2.5 删除

如果你要删除元素呢?

链表也是更好的选择,因为只需修改前一个元素指向的地址即可。

而使用数组时,删除元素后,必须将后面的元素都向前移。


下面是常见数组和链表操作的运行时间。


数组和链表哪个用得更多呢?

显然要看情况。但数组用得很多,因为它支持随机访问。

有两种访问方式:随机访问 和 顺序访问。顺序访问意味着从第一个元素开始逐个地读取元素。链表只能顺序访问。随机访问意味着可直接跳到第十个元素。

本书经常说数组的读取速度更快,这是因为它们支持随机访问。

很多情况都要求能够随机访问,因此数组用得很多。



2.3 选择排序

假设你的计算机存储了很多乐曲。对于每个乐队,你都记录了其作品被播放的次数。

你要将这个列表按播放次数从多到少的顺序排列,从而将你喜欢的乐队排序。该如何做呢?

一种办法是遍历这个列表,找出作品播放次数最多的乐队,并将该乐队添加到一个新列表中。再次这样做,找出播放次数第二多的乐队。继续这样做,你将得到一个有序列表。

要找出播放次数最多的乐队,必须检查列表中的每个元素。这需要的时间为O (n )。因此对于这种时间为O (n )的操作,你需要执行n 次。需要的总时间为 O (n × n ),即O ( n 2 n^2 n2)。


示例代码:

将数组元素按从小到大的顺序排列。先编写一个用于找出数组中最小元素的函数。
然后,使用这个函数来编写选择排序算法。

def findSmallest(arr):
    smallest = arr[0]
    smallest_index = 0
    for i in range(len(arr)):
        if arr[i] < smallest:
            smallest = arr[i]
            smallest_index = i
    return smallest_index

def selectionsSort(arr):
    newArr = []
    for i in range(len(arr)):
        smallest = findSmallest(arr)
        newArr.append(arr.pop(smallest))
    return newArr

print(selectionsSort([5,3,6,2,10]))


References:
《 算法图解》—— 第2章 选择排序

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

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

相关文章

ElasticSearch面试

Welcome to Elastic Docs | Elastic 1. ES的结构和底层实现 ES的整体结构? 一个 ES Index 在集群模式下&#xff0c;有多个 Node &#xff08;节点&#xff09;组成。每个节点就是 ES 的Instance (实例)。每个节点上会有多个 shard &#xff08;分片&#xff09;&#xff0…

koa框架(二) mvc 模式及实现一个koa框架的web服务

mvc三层架构 mvc&#xff0c; 即 model 、controller、view&#xff1b;mvc模式将model、view、controller分离&#xff1b;使用mvc分层是系统更加灵活&#xff0c;扩展性更强。让程序更加直观、复用性更强、可维护性更强。 model 负责数据访问&#xff1b;controller 负责消息…

嵌入式设备文件系统构建——增加用户登录功能

1、修改inittab文件 #first:run the system script file ::sysinit:/etc/init.d/rcS# 进入命令行 #::askfirst:-/bin/sh#添加执行登录验证 ::sysinit:/bin/login::ctrlaltdel:-/sbin/reboot #umount all filesystem ::shutdown:/bin/umount -a -r #restart init process ::res…

2022-11-16 几种三角函数的图形

为了方便查看几个函数的关系图&#xff0c;记录一下几种三角函数的大致图像。 三角函数&#xff1a;tan⁡(x)\tan(x)tan(x)&#xff0c;cos⁡(x)\cos(x)cos(x)&#xff0c;sin⁡(x)\sin(x)sin(x)。 三角函数&#xff1a;tan⁡(x2)\tan(\dfrac{x}{2})tan(2x​)&#xff0c;cos…

盘点 三款高可用的机器学习模型 web页面化的工具(一)

笔者只是抛砖引玉&#xff0c;把三款看到的在本篇简单的介绍。 如果有其他更好的欢迎留言推荐&#xff0c;后续笔者会对这三款做一一的学习。 文章目录1 streamlit2 Gradio3 codepen1 streamlit 笔者之前写过该专题&#xff1a; python︱写markdown一样写网页&#xff0c;代码…

SpringCloud - 项目搭建

文章目录1.创建父工程项目2.父工程POM配置3.创建RestFul 服务器3.1 支付模块3.1.1 创建module3.1.2 改POM3.1.3 写YML3.1.4 主启动3.1.5 业务类3.2 订单模块3.2.1 创建module3.2.2 改POM3.2.3 写YML3.2.4 主启动3.2.5 业务类4.工程重构1.创建父工程项目 打开IDEA 创建一个Mave…

从零开始的深度学习之旅(1)

目录0.前言1.单层神经网络1.1 单层神经网络基础(线性回归算法)1.2 torch.nn.Linear实现单层回归神经网络的正向传播2.二分类神经网络&#xff1a;逻辑回归2.1 逻辑回归与门代码实现2.2 符号函数2.2.1 sign函数2.2.2 Relu函数2.2.3 tant函数3. 多分类神经网络&#xff1a;Softma…

Vue:实战快速上手

采用实战模式并结合ElementUI 组件库&#xff0c;将所需知识点应用到实际中&#xff0c;以最快速度掌握Vue的使用; 桌面化应用 ElementUI: https://element.eleme.cn/#/zh-CN/ 弹窗 LayUI 的 layer &#xff08;由于官网已下架&#xff0c;在此使用镜像): https://www.layui.s…

【网页设计】基于HTML在线图书商城购物项目设计与实现_(图书商城10页) bootstarp响应式

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 在线商城购物 | 水果商城 | 商城系统建设 | 多平台移动商城 | H5微商城购物商城项目 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&a…

[附源码]java毕业设计停车场信息管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

抢购软件使用方法(如何开发抢购软件)

如果做抢购软件的话需要好的协议以及算法&#xff0c;我用的这份协议目前非常稳定&#xff0c;所以今天给大家讲解下抢购软件的流程以及使用方法 01软件设置选项详解 一、无障碍服务 二、使用网路时间 软件第一行一般都是当前设备比XX慢了&#xff08;快了&#xff09;XXms&…

Vue3铺垫知识【ES6 模块化、Promise、async/await、EventLoop、宏任务和微任务、总结】

文章目录ES6 模块化1. 回顾&#xff1a;node.js 中如何实现模块化2. 前端模块化规范的分类3. 什么是 ES6 模块化规范4. 在 node.js 中体验 ES6 模块化5. ES6 模块化的基本语法5.15.1.1 默认导出5.1.2 默认导入5.1.3 默认导出的注意事项5.1.4 默认导入的注意事项5.25.2.1 按需导…

Python:Linux下安装Anaconda,可多人使用(内容几乎完整)

前言 前言属于与内容无关的写作意图。要看正文&#xff0c;请直接跳转至本文主要内容。 很久不见。最近手里有很多事&#xff0c;比如&#xff0c;体检、装机、加班。再加上我现在为了速记&#xff0c;会把东西记到跨平台的笔记软件“OneNote”&#xff08;大画板&#xff0c…

尚医通 (二十六) --------- 科室接口开发

目录一、上传科室接口1. 添加科室基础类2. 上传科室二、查询科室接口三、删除科室接口一、上传科室接口 1. 添加科室基础类 A、添加 model 说明&#xff1a;由于实体对象没有逻辑&#xff0c;我们已经统一导入 com.fancy.yygh.model.hosp.Department B、添加 repository 添…

多元正态分布

最广为使用的基于模型的聚类方法依赖于多元正态分布。多元正态分布是对p个变量正态分布的一种推广。该分布使用一组均值和协方差矩阵∑定义。协方差矩阵是变量间相关性的度量. 协方差矩阵∑由p个方差以及所有变量对的协方差σi,ji≠j&#xff09;构成。矩阵的行和列均用变量表…

闲活一:一步登天

标题不希望能被人搜到&#xff0c;因为目前没有任何技术含量&#xff0c;可行性也偏低&#xff0c;纯纯的预研阶段。 项目起步阶段是最无从下手的阶段&#xff0c;还是先明确大目标。我这个赛车要做什么&#xff0c;怎样去做。 做什么 我脑中蹦出的大方向是这样的 玩家体…

初识Matter协议

初识Matter协议什么是MatterMatter有什么用Matter的核心优势Matter网络的组网方式什么是Matter Matter的概念最初在2019年12月被提出&#xff0c;当时被称为CHIP(Connected Home Over IP)&#xff0c;之后在2021年5月作为全新的连接标准被正式提出。 CHIP是由AWS、Google、App…

1. 算法简介

1.2 二分查找 二分查找是一种算法&#xff0c;其输入是一个有序的元素列表。如果要查找的元素包含在列表中&#xff0c;二分查找返回其位置; 否则返回null 。 使用二分查找时&#xff0c;最多需要检查log n 个元素。 仅当列表是有序的时候&#xff0c;二分查找才管用。 完整…

XCTF1-web php

场景一&#xff1a;simple_php 题目描述 小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 进入场景 给了php代码&#xff0c;分析一下 GET传入两个参数a,b aaa_GET[“a”];其中的是为了防止没有$_GET[‘a’]出现错误提示 $a0 and a&#xff1a;a等于0,且a是…

Spring之Bean生命周期之二--- Instantiation阶段

在BeanFactory中&#xff0c;主要的流程就是创建Bean的过程&#xff0c; // 核心方法: 创建Bean实列对象,并且生命周期的动作大部分都在这里。Object beanInstance doCreateBean(beanName, mbdToUse, args);Bean的生命周期包括: 实例化设置属性值初始化值销毁 实例化Bean在…