算法

一、算法复杂度

#什么是算法复杂度:
    算法在编写成可执行程序后,运行时所需要的资源,资源包括时间资源和内存资源
#一个算法的评价  (衡量代码的好坏)  
  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
原文地址:https://www.cnblogs.com/pdun/p/11115507.html