zoukankan      html  css  js  c++  java
  • <算法图解>读书笔记:第2章 选择排序

    第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 小结

    • 计算机内存犹豫一大堆抽屉
    • 需要存储多个元素时,可使用数组或链表
    • 数组的元素都在一起
    • 链表的元素时分开的,其中每个元素都存储下一个元素的地址
    • 数组的读取速度很快
    • 链表的插入和删除速度很快
    • 在同一个数组中,所有的元素的类型都必须相同
  • 相关阅读:
    LeetCode(Weekly Contest 187)题解
    2021 暑期实习招聘思之未雨绸缪
    LeetCode(Weekly Contest 185)题解
    构建私有的 docker registry
    LeetCode(Weekly Contest 182)题解
    Win10图标变白
    远程连接linux上的mysql
    IDEA复制粘贴html文件打不进war包问题
    Git命令
    数据源收集
  • 原文地址:https://www.cnblogs.com/wangbaby/p/10290759.html
Copyright © 2011-2022 走看看