一、算法复杂度
#什么是算法复杂度: 算法在编写成可执行程序后,运行时所需要的资源,资源包括时间资源和内存资源 #一个算法的评价 (衡量代码的好坏) 1、时间复杂度 (运行时间) 2、空间复杂度 (占用空间 )
1.1时间复杂度
1、时间频度, 一个算法执行所消耗的时间,从理论上是不能算出来的,必须上机测试才知道,但我们不可能对每个算法都上机测试,只需要知道哪个算法花费的时间多,哪个算法花费的时间少就可以了,并且一个算法花费的时间与算法语句中语句执行数成正比,哪个算法中语句执行次数多,它花费的时间就多, #一个算法中语句执行次数称为语句频度或时间频度,记为T(n) #算法的时间复杂度是指,执行算法所需要的计算工作量 2、时间复杂度 在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),存在一个正常数c使得fn*c>=T(n)恒成立。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。 在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1),另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n^2+3n+4与T(n)=4n^2+2n+1它们的频度不同,但时间复杂度相同,都为O(n^2)。
#时间复杂度的计算 看看有几重for循环,只有一重则时间复杂度为O(n),二重则为O(n^2),依此类推,如果有二分则为O(logn),二分例如快速幂、二分查找,如果一个for循环套一个二分,那么时间复杂度则为O(nlogn)。 #分类 #按数量级递增排列,常见的时间复杂度有: 常数阶O(1),对数阶O( ),线性阶O(n), 线性对数阶O(nlog2n),平方阶O(n^2),立方阶O(n^3),..., k次方阶O(n^k),指数阶O(2^n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
空间复杂度
#与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量。 #记作:S(n)=O(f(n)) #算法执行期间所需要的存储空间包括3个部分: 算法程序所占的空间; 输入的初始数据所占的存储空间; 算法执行过程中所需要的额外空间。 在许多实际问题中,为了减少算法所占的存储空间,通常采用压缩存储技术。
列表排序
冒泡排序
#冒泡排序 从开头开始,第一个与第二个比,大的放后边,再让第二个(上次比的大值)和第三个比,大的放后边,依次类推,最大的就在最后边, 然后在从开头开始,继续比较 #循环到len(l)-1-i
li =[7,5,4,6,3,8,2,9,1] def bubble_sort(li): for i in range(len(li)-1): #如果i=0,下面的循环到最后 for j in range(len(li)-1-i): #如果i=1,循环到倒数第三个 if li[j]>li[j+1]: li[j],li[j+1] = li[j+1],li[j] bubble_sort(li) print(li) #完整版(如果本来都是有序的,没必要再进行排序) li =[7,5,4,6,3,8,2,9,1] def bubble_sort(li): for i in range(len(li)-1): #flag=False for j in range(len(li)-1-i): if li[j]>li[j+1]: #一直都是后边的大,不会走下面的代码,flag不会改变 li[j],li[j+1] = li[j+1],li[j] #flag=True #if not flag: return bubble_sort(li) print(li)
选择排序
#选择排序 一趟遍历最小的数,放到第一个位置, 再一趟遍历剩余列表中的最小数,放到第二个位置 以此类推 li =[7,5,4,6,3,8,2,9,1] def select_sort(li): for i in range(len(li)-1): minLoc = i #假设第i个是最小值 for j in range(i+1,len(li)): #i+1,和后边的值比 if li[minLoc]>li[j]: #如果假设的值不是最小,交换位置 li[minLoc],li[j] = li[j],li[minLoc] select_sort(li) print(li)
、
插入排序
#拿出一个值,以此和前边的值比,如果大于小于前边的值,前边的值把当前位置覆盖,再往前比,等到 def insert_sort(li): for i in range(1, len(li)): tmp = li[i] j = i - 1 while j >= 0 and li[j]>tmp: li[j+1]=li[j] j=j-1 li[j+1]=tmp