蓝色星晨|Python学习重在实践,对选择排序法的发散练习

对于刚入门Python的人经常有这样一种感觉 , 那就是当看到别人写的代码时 , 大脑说:“真简单 , 我会了!”但等到需要自己去写代码时 , 手却说 , “对不起 , 我不会 。 ”
这就是缺乏实践的缘故!实践可以让我们做到熟能生巧 , 对于一些常规的问题形成条件反射 , 手指和大脑形成快速联动 。 实践的一种好方式就是 , 选择一个目标 , 然后不断进行发散 , 通过不同的方式去完成 , 每完成一种方式就是对这种方式所涉及到知识的一种巩固 。 这也是我们在《Python学习方法:先生主干、再繁枝叶 , 任何领域都适用》一文中所提倡的学习方法 。
本文以选择排序法为例 , 研究各种不同的实现方式 , 以及过程中所涉及到的知识点 。
选择排序法介绍【蓝色星晨|Python学习重在实践,对选择排序法的发散练习】选择排序法是一种非常简单直观的算法 , 虽然简单 , 但也可以锻炼下逻辑思维能力 。 它的实现步骤如下:

  • 在未排序序列中找到最小值 , 放在排序序列的起始位置;
  • 从剩余未排序序列中继续寻找最小值 , 放在已排序序列的末尾;
  • 重复第二步 , 直到所有元素排序完毕 。
选择排序法发散下图列出了对于选择排序法可供发散的方向 , 但发散方向因人而异 , 每个人都可以想到很多与众不同的发散方向 , 本图仅供参考 。
蓝色星晨|Python学习重在实践,对选择排序法的发散练习(1)复杂度
算法复杂度分为时间复杂度和空间复杂度 , 空间复杂度是程序在运行过程中占用了多少的内存 , 时间复杂度是算法运行时间的度量 。
  • 程序执行时间和执行次数成正比;
  • 时间复杂度是程序执行次数的最高价;
  • 用大O表示时间复杂度 , 其是表示代码执行时间随数据规模增长的变化趋势 , 也称渐进时间复杂度 , 简称时间复杂度;
  • 空间复杂度的衡量方式和时间复杂度一样 。
复杂度是一种抽象的衡量 , 但如果想知道程序的具体执行时间我们可以通过相关代码来实现 。
import datetime as dtstart=dt.datetime.now()'''执行程序'''end=dt.datetime.now()elapsed=end-start(2)逻辑思维能力
在理解排序的原理时 , 大脑会抽象形成排序的动态过程 , 抽象这一过程不仅是对大脑逻辑思维能力的锻炼 , 同时也能寻找到新的逻辑方法 。
编程实践Python中是有现成的排序方法的 。 根据这 , 我们可以复习下列表的两个排序函数 。
import numpy as npla=list(np.random.randint(0,100,20))la.sort(key=lambda x: np.sin(x),reverse=False)#key是排序的条件;默认升序 , reverse表示是否反转;不返回任何值 , 更改原列表sorted(la,key=lambda x: np.sin(x)),reverse=False) #不更改原列表 , 返回排序后的列表(1)常规方法
常规方法就是文章前面提到的逻辑 , 通过双层循环来对序列进行排序 。 在这种方法中可以好好理解下交换赋值法
import numpy as npla=list(np.random.randint(0,100,20))def sort_select_one(la):for i in range(len(la)-1):for j in range(i+1,len(la)):if la[i]>la[j]:la[i],la[j]=la[j],la[i] #理解交换赋值法法 , 解释器从右向左计算 , 然后链式赋值else:continuereturn lasort_select_one(la)(2)自定义方法
我们可以先自定义一个寻找最小值和其索引的函数 , 然后再将对序列进行第二层循环变更为函数调用 。 通过此法可以掌握自定义函数的调用 , 以及传递参数的理解 。
import numpy as npla=list(np.random.randint(0,100,20))#自定义计算最小值的函数def min_value(la):min_value=http://kandian.youth.cn/index/np.infmin_index=np.inffor i,j in enumerate(la):if j


推荐阅读