<算法图解>读书笔记:第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 小结

  • 计算机内存犹豫一大堆抽屉
  • 需要存储多个元素时,可使用数组或链表
  • 数组的元素都在一起
  • 链表的元素时分开的,其中每个元素都存储下一个元素的地址
  • 数组的读取速度很快
  • 链表的插入和删除速度很快
  • 在同一个数组中,所有的元素的类型都必须相同
posted @ 2019-01-19 11:03  汪小鹏boy  阅读(141)  评论(0编辑  收藏  举报