排序-冒泡
bubble_sort方法:
1.列表相邻两个数,前面若比后面的大,则交换两个数
2.一趟过后,最后一个数是最大的,为有序区,则未排序区域减少一个数
简单粗暴法:时间复杂度:O(n²)
def bubble_sort(li):
for i in range(len(li) - 1): # i趟
for j in range(len(li) - 1 - i): # 每一趟比较无序的区域,第i趟会产生i个有序的数
if li[j] > li[j + 1]: # 当前数和后一个做对比
li[j], li[j + 1] = li[j + 1], li[j]
li = [8, 7, 9, 5, 4, 2, 6, 1, 3]
bubble_sort(li)
print(li)
优化(能省则省):
def bubble_sort(li):
for i in range(len(li) - 1): # i趟
exchange = False # 表示本趟是否操作排序
for j in range(len(li) - 1 - i): # 每一趟比较无序的区域,第i趟会产生i个有序的数
if li[j] > li[j + 1]: # 当前数和后一个做对比
li[j], li[j + 1] = li[j + 1], li[j]
exchange = True
if not exchange:
return # 如果当前趟内每个数的对比发现没有移动,则已完成排序
li = [8, 7, 9, 5, 4, 2, 6, 1, 3]
bubble_sort(li)
print(li)
排序-选择
select_sort方法:
1.将每趟排序最小的数取出来,放到第一个位置,这部分是已经选出的有序区
2.然后继续在无序区中取最小的数继续放到下一个位置,依次排序
简单粗暴的选择排序:时间复杂度O(n³)
不推荐:使用两个列表占用资源
def select_sort(li):
li_new = []
for i in range(len(li)):
min_value = min(li)
li_new.append(min_value)
li.remove(min_value)
# li_new.append(li.pop(li.index(min_value))) #pop移除也可以
return li_new
li = [8, 7, 9, 5, 4, 2, 6, 1, 3]
print(select_sort(li))
优化:时间复杂度O(n²)
选择出的最小值跟无序区第一个位置进行交换
def select_sort_new(li):
for i in range(len(li) - 1):
min_loc = i
for j in range(i + 1, len(li)):
if li[j] < li[min_loc]:
min_loc = j
li[i], li[min_loc] = li[min_loc], li[i]
li = [8, 7, 9, 5, 4, 2, 6, 1, 3]
select_sort_new(li)
print(li)
排序-插入
inser_sort方法:
1.每次从无序区拿出一个值
2.放到有序区对应位置
def insert_sort(li):
for i in range(1, len(li)):
tmp = li[i]
j = i - 1
# j是列表第0位,拿i列表第1位,两个数据做比较
while j >= 0 and li[j] > tmp:
li[j + 1] = li[j]
j -= 1
li[j + 1] = tmp
li = [8, 7, 9, 5, 4, 2, 6, 1, 3]
insert_sort(li)
print(li)
总结
上述均为原地排序,时间复杂度均为O(n²)