标签:sel 完成 模块 start als 常见 imp 表示 时间复杂度
一个计算过程,解决问题的方法
import time
start_time = time.time()
#... 代码体
end_time =time.time()
print(end_time - start_time) ### 耗时时间
缺点:必须以硬件相同为前提
O()
来表示时间复杂度:
li = [7, 5, 4, 6, 3, 8, 2, 9, 1]
def bubble_sort(li):
for i in range(len(li)-1, 0, -1):
for j in range(i):
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
if __name__ == '__main__':
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, 0, -1):
flag = True
for j in range(i):
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
flag = False
if flag:
return None
if __name__ == '__main__':
bubble_sort(li)
print(li)
为每一个位置选择当前最小的元素
时间复杂度:O(n^2^)
li = [7, 5, 4, 6, 3, 8, 2, 9, 1]
def select_sort(li):
for i in range(len(li)-1):
min_loc = i
for j in range(i+1, len(li)):
if li[min_loc] > li[j]:
li[min_loc], li[j] = li[j], li[min_loc]
if __name__ == '__main__':
select_sort(li)
print(li)
注意:
选择排序不是稳定的排序算法,它在计算过程中会破坏稳定性。
举例:
序列58539.我们知道第一遍选择第1个元素“5”会和元素“3”交换,那么原序列中的两个相同元素“5”之间的前后相对顺序就发生了改变。
时间复杂度:O(n^2^)
li = [7, 5, 4, 6, 3, 8, 2, 9, 1]
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 -= 1
li[j+1] = tmp
if __name__ == '__main__':
insert_sort(li)
print(li)
取一个元素p(第一个元素),使元素p归位;
归位:列表被p分成两部分,左边都比p小,右边都比p大
递归完成排序
li = [7, 5, 4, 6, 3, 8, 2, 9, 1]
def partition(data, left, right):
tmp = data[left]
while right > left:
while left < right and tmp <= data[right]:
right -= 1
data[left] = data[right]
while left < right and tmp > data[left]:
left += 1
data[right] = data[left]
data[left] = tmp
return left
def quick_sort(data, left, right):
if left < right:
mid = partition(data, left, right)
quick_sort(data, left, mid-1)
quick_sort(data, mid+1, right)
quick_sort(li, 0, len(li)-1)
print(li)
li = [7, 5, 4, 6, 3, 8, 2, 9, 1]
def quick_sort(data):
"""快速排序"""
if len(data) >= 2: # 递归入口及出口
mid = data[len(data) // 2] # 选取基准值,也可以选取第一个或最后一个元素
left, right = [], [] # 定义基准值左右两侧的列表
data.remove(mid) # 从原始数组中移除基准值
for num in data:
if num >= mid:
right.append(num)
else:
left.append(num)
return quick_sort(left) + [mid] + quick_sort(right)
else:
return data
print(quick_sort(li))
标签:sel 完成 模块 start als 常见 imp 表示 时间复杂度
原文地址:https://www.cnblogs.com/lucky75/p/11862621.html