算法
1.时间复杂度:
问题:
程序执行的时间长短,前提的基础是 硬件的条件必须相同
根本解决办法:
程序执行的大概次数 用O(n) n代表程序执行的次数
时间复杂度小结
时间复杂度是用来估计算法运行时间的一个式子(单位).
一般来说,时间复杂度高的算法比复杂度低的算法慢
常见的时间复杂度(按效率排序)
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)
如何一眼判断时间复杂度?
循环减半的过程==>O(logn)
几次循环就是n的几次方的复杂度 # 比如两个for循环嵌套,就是n2
2.空间复杂度:
用来评估算法内存占用大小的一个式子
冒泡排序
def BubbleSort(li):
for i in range(len(li)): # 执行几次
# 优化机制
flag = True
for j in range(len(li)-i-1): # i等于几就表示几个数确定了
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j] # 交叉赋值
flag = False
if flag:
return None
li = [7, 5, 4, 6, 3, 8, 2, 9, 1]
BubbleSort(li)
print(li)
# 时间复杂度: 两层循环O(n2)
# 空间复杂度:O(1) # 没有额外的申请内存空间,比如在程序中 l = []
# 当给出的是已经排好序的列表,我们就可以进行简单地优化
选择排序
时间复杂度: O(n2)
空间复杂度: O(1)
def SelectSort(li):
for i in range(len(li)):
minLoc = i # 随便拿出一个数字进行对比
for j in range(r + 1, len(li)):
if li[j] < li[minLoc]:
li[j], li[minLoc] = li[minLoc], li[j]
li = [7, 5, 4, 6, 3, 8, 2, 9, 1]
SelectSort(li)
print(li)
插入排序
时间复杂度: O(n2)
空间复杂度: O(1)
列表被分为有序区和无序区两个部分.最初有序区只有一个元素.
每次从无序区选择一个元素,插入到有序区的位置,直到无序区变空
def InsertSort(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
li = [7, 5, 4, 6, 3, 8, 2, 9, 1]
InsertSort(li)
print(li)
快速排序
快速排序
快速排序的原理是取序列的第一个元素为基准元素,指定两个指针分别指向序列的开始和结尾,拿结尾指针指向的元素与基准元素比较,如果该元素比基准元素大,则指针减一继续比较,一旦发现比基准元素小的元素,则将该元素放至序列的最左侧,然后拿开始指针指向的元素与基准元素比较,如果该元素比基准元素小,则指针增一继续比较,一旦发现比基准元素大的元素,则将该元素放至结尾指针指向的位置,重复上述过程,则比基准元素大的元素全部到了基准元素右侧,比基准元素小的元素全部到了基准元素左侧,然后对左右两部分继续上述过程,不难发现可应用递归完成最终的排序。
程序
时间复杂度: O(nlogn)
def partition(li, left, right):
temp = li[left]
while left < right:
while left < right and li[right] > tmp:
right = right - 1
li[left] = li[right]
while left < right and li[left] < tmp:
left = left + 1
li[right] = li[left]
li[left] = li[right] = tmp
return left
def Quick_Sort(li, left, right):
if left < right:
mid = partition(li, left, right)
Quick_Sort(li, left, mid)
Quick_Sort(li, mid+1, right)
li = [7, 5, 4, 6, 3, 8, 2, 9, 1]
Quick_Sort(li, 0, len(li) - 1)
print(li)