• 《算法图解》学习笔记_02选择排序


    本章内容

    学习两种最基本的数据结构——数组和链表;

    学习排序算法

    内存的工作原理

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

    链表

    数组意味着所有项目的内存都是相连的

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

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

    链表中添加元素:只要将其放入内存,并将其地址存储到前一个元素中

    使用链表时,根本不需要移动元素,只要有足够的内存空间,就能为链表分配内存。

    链表的优势插入元素方面。

    数组

    数组与链表不同,使用数组可以知道每个元素的地址。而链表需要知道前一个元素的地址,才能知道下一个元素的地址。

    随机读取元素时,数组的效率很高,可以迅速找到数组的任何元素;而对于链表,需要先访问第一个元素才能获取第二个元素的地址

    元素的位置称为索引

    常见的数组和链表的运行时间:

                   数组        链表    

    读取         O(1)         O(n)

    插入         O(n)        O(1)

    其中,O(n)表示线性时间,O(1)表示常量时间。

    中间插入:在使用链表时,插入元素很简单,只需要修改它前面的那个元素指向的地址即可;在使用数组时,必须将后面的元素都向后移

    在中间插入元素时,链表是更好的选择。

    (中间)删除:链表在删除元素时,也是更好的选择,只需要修改前一个元素指向的地址即可;在使用数组时,删除元素后,必须将后面的元素都向前移

    删除元素总能成功,如果内存中没有足够的空间,插入操作可能失败,但在任何情况下都能将元素删除。

    常见的数组和链表的运行时间:

                   数组        链表     

    读取         O(1)         O(n)

    插入         O(n)        O(1) 

    删除         O(n)        O(1)      

    仅当能够立即访问要删除的元素时,删除操作的运行时间才为O(1)。通常我们都记录了链表的第一个元素和最后一个元素,因此删除这些元素的运行时间为O(1)。

    数组支持随机访问,而链表只能顺序访问

    选择排序

    选择排序需要的总时间为O(n*n),即O(n2)

    选择排序Python3代码:

    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 selectionsort(arr):                                   #对数组进行从小到大的排序
      newarr = []                                            #储存排序后数组
      for i in range(len(arr)): 
        smallest = findsmallest(arr)               #找到最小值的索引
        newarr.append(arr.pop(smallest))       #加入到newarr中,并从原数组arr中删除
      return newarr

    print(selectionsort([3, 5, 1, 2]))                       #测试

     

    小结

    需要储存多个元素时,可以使用数组或链表

    数组的元素都在一起

    链表的元素是分开的,其中每个元素都储存了下一个元素的地址

    数组读取速度很快;

    链表插入和删除速度很快;

    同一个数组中,所有的元素类型都必须相同

    欢迎大家多多批评指正

    祝好

    Violet HE

    2019.2.27 20:36

    你必须非常努力,才能看起来毫不费力。
  • 相关阅读:
    C#代码
    属性面板:tabcontroller
    窗体效果
    c#窗体开发
    帝国cms学习
    在树莓派上运行 .net core 2.1 程序 并实现开机启动
    C# 高性能的数组 高性能数组队列实战 HslCommunication的SharpList类详解
    C# 序列化详解,xml序列化,json序列化对比
    C# 读写redis C#读写实时数据库
    python 读写三菱PLC数据,使用以太网读写Q系列,L系列,Fx系列的PLC数据
  • 原文地址:https://www.cnblogs.com/violethjq/p/10446293.html
Copyright © 2020-2023  润新知