第2章 选择排序

2.1 内存的工作原理

  • 需要将数据存储到内存时,请求计算机提供存储空间,计算机会给一个存储地址.需要存储多项数据时,有两种基本方式-数组和链表

2.2 数组和链表

2.2.1 链表

  • 链表中的元素可存储在内存的任何位置
  • 链表的每个元素都存储下一个元素的地址,从而使一系列随机的内存地址在一起
  • 使用链表时,根本就不需要移动元素.只要足够的内存空间,就能为链表分配内存
  • 链表的优势在插入元素方面

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

来自<百度百科>

2.2.2 数组

  • 链表跳跃读取元素时,需要依次访问该元素前的元素(获得下个元素地址),降低了效率.数组中的元素是连在一起的,知道每一个元素的地址,容易做到跳跃读取元素

所谓数组,是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。这些无序排列的同类数据元素的集合称为数组。

来自<百度百科>

2.2.3 术语

  • 常见的数组和链表操作运行时间

    - 数组 链表
    读取 \(O _{(1)}\) \(O _{(n)}\)
    插入 \(O _{(n)}\) \(O _{(1)}\)
    删除 \(O _{(n)}\) \(O _{(1)}\)
    • \(O _{(n)}\) 线性时间
    • \(O _{(1)}\) 常量时间

2.2.4 在中间插入

  • 需要在中间插入元素时,链表只需要修改它前面的那个元素指向的地址.而使用数组时,则必须将后面的元素都向后移,如果没有足够的控件,可能还得将整个数组复制到其它地方

2.2.5 删除

  • 链表删除元素时只需要修改前一个元素指向的地址即可.而使用数组时,删除元素后,必须将后面的元素都向前移
  • 不同于插入,删除元素总能成功.如果内存中没有足够的空间,插入操作可能失败,但在任何情况下能够将元素删除
  • 链表只能顺序访问,数组支持顺序访问和随机访问
  • 数组和链表能被用来实现其他数据结构

2.3 选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

来自<百度百科>

  • 选择排序的时间复杂度为\(O _{(n)}\)

  • 随着排序的进行,每次需要检查的元素数在减少,最后一次需要检查的元素都只有一个,检查元素数依次为n-1,n-2,...,2,1.平均检查的元素为\(\frac{n}{2}\),因此运行时间为\(O _{(\frac{n}{2})}\).但大O表示法省略了诸如\(\frac{n}{2}\)这样的常数

  • python选择排序代码:

    def selectionSort(arr):
    newArr = []
    for i in range(len(arr)):
    smallest = min(arr)
    newArr.append(smallest)
    arr.remove(smallest)
    return newArr myList = [5,3,25,6,9,11,1,66,21,88,74,2]
    print(selectionSort(myList))

2.4 小结

  • 计算机内存犹豫一大堆抽屉
  • 需要存储多个元素时,可使用数组或链表
  • 数组的元素都在一起
  • 链表的元素时分开的,其中每个元素都存储下一个元素的地址
  • 数组的读取速度很快
  • 链表的插入和删除速度很快
  • 在同一个数组中,所有的元素的类型都必须相同

<算法图解>读书笔记:第2章 选择排序的更多相关文章

  1. <算法图解>读书笔记:第1章 算法简介

    阅读书籍:[美]Aditya Bhargava◎著 袁国忠◎译.人民邮电出版社.<算法图解> 第1章 算法简介 1.2 二分查找 一般而言,对于包含n个元素的列表,用二分查找最多需要\(l ...

  2. <算法图解>读书笔记:第4章 快速排序

    第4章 快速排序 4.1 分而治之 "分而治之"( Divide and conquer)方法(又称"分治术") ,是有效算法设计中普遍采用的一种技术. 所谓& ...

  3. <算法图解>读书笔记:第3章 递归

    第3章 递归 3.1 递归 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一 ...

  4. 《Linux内核设计与实现》第八周读书笔记——第四章 进程调度

    <Linux内核设计与实现>第八周读书笔记——第四章 进程调度 第4章 进程调度35 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配 ...

  5. 《Linux内核设计与实现》 第八周读书笔记 第四章 进程调度

    20135307 张嘉琪 第八周读书笔记 第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.只有 ...

  6. 《Linux内核分析》读书笔记(四章)

    <Linux内核分析>读书笔记(四章) 标签(空格分隔): 20135328陈都 第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行 ...

  7. 《Linux内核设计与实现》第五周读书笔记——第十一章

    <Linux内核设计与实现>第五周读书笔记——第十一章 20135301张忻 估算学习时间:共2.5小时 读书:2.0 代码:0 作业:0 博客:0.5 实际学习时间:共3.0小时 读书: ...

  8. 《LINUX内核设计与实现》第三周读书笔记——第一二章

    <Linux内核设计与实现>读书笔记--第一二章 20135301张忻 估算学习时间:共2小时 读书:1.5 代码:0 作业:0 博客:0.5 实际学习时间:共2.5小时 读书:2.0 代 ...

  9. # linux读书笔记(3章)

    linux读书笔记(3章) 标签(空格分隔): 20135328陈都 第三章 进程管理 3.1 进程 进程就是处于执行期的程序(目标码存放在某种存储介质上).但进程并不仅仅局限于一段可执行程序代码( ...

随机推荐

  1. JN_0008:win下通过cmd进入指定目录

    1,WIN+R,调出运行命令窗口,并输入CMD,回车确认运行 2,先进入盘符,如:    d: 3,再进入盘符下的指定目录,如:    cd test 4,一次性进入指定目录(要用到  /d 命令): ...

  2. PHP代码审计之命令注入

    命令注入 命令注入就是通过利用无验证变量构造特殊语句对服务器进行渗透. 注入的种类有很多,而不仅仅是SQL Injection. php常见注入有以下几种(常见:,常见!!): 命令注入 (Comma ...

  3. 【转】Java 通过JDBC连接Mysql数据库的方法和实例【图文说明】

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...

  4. twfont

    module game { /** *Created by 渔歌烟火 on 2018/3/28. * 字体缓动动画 */ export class LabelEffect { private stat ...

  5. 前端笔记之JavaScript(五)关于数组和字符串那点事

    一.数组 1.1数组概念 数组(array)是一个有序的数据集合.说白了,数组就是一组数.数组内部可以存放一个或多个单独的数据,整体组成数组. 定义数组最简单的方式:数组字面量. 数组的字面量“[]” ...

  6. Python爬虫基础之UrlError

    一.urllib.error python的urllib.error模块主要是应对urllib.request在网络请求过程中出现的异常而定义的异常处理类.主要有URLError和HTTPError两 ...

  7. Python——字符串

    p ython——字符串 ①加法 连接两个字符串 ②乘法  复制字符串 python——转义字符 \n 换行 \' 单引号 \'' 双引号 \\ 反斜杠 raw字符串:无视转义字符   转义: 字符串 ...

  8. 初识C语言 (四)

    分支结构 if语句 C语言中的分支结构语句中的if条件语句,简单if语句的基本结构如下: 其语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句. 其过程可表示为下图 实例: if(resu ...

  9. JAVA第二次实训作业

    1.一维数组的创建和遍历. 声明并创建存放4个人考试成绩的一维数组,并使用for循环遍历数组并打印分数. 要求: 首先按“顺序”遍历,即打印顺序为:从第一个人到第四个人: 然后按“逆序”遍历,即打印顺 ...

  10. SSM框架中写sql在dao文件中以注解的方式

    1以注解方式 //两个参数其中一个是对象需写,对象.属性 @Update("update delivery_address set consignee = #{address.consign ...