zoukankan      html  css  js  c++  java
  • 《算法图解》学习笔记_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

    你必须非常努力,才能看起来毫不费力。
  • 相关阅读:
    添雨跟打器各字体显示效果(巳已己、单字前五百、词组标记线)-by老随风
    添雨跟打器保存文章进度功能-by老随风
    指爱打字群添雨跟打器使用教程(指爱群新手教程)-by指爱群友
    小鹤双拼飞扬版码长控制个人经验-by老随风
    小鹤双拼飞扬版编码清除功能-by老随风
    小鹤双拼学习指引-by小鹤双拼作者-散步的鹤
    小鹤双拼提速方法个人经验-by老随风
    打字提速练习方法-by小鹤双拼QQ群友-微笑的军师
    新手如何快速上手双拼,提高打字速度-by小鹤双拼输入法QQ群友-弧
    小鹤双拼飞扬版反查编码功能解释-by老随风
  • 原文地址:https://www.cnblogs.com/violethjq/p/10446293.html
Copyright © 2011-2022 走看看