《算法图解》学习笔记_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

 

转载于:https://www.cnblogs.com/violethjq/p/10446293.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值