本文已参与「新人创作礼」活动,一起开启掘金创作之路
python实现三种常见的排序
冒泡排序
时间复杂度 O(n^2^)
冒泡排序是我们最开始学的一种排序方式,熟练的掌握冒泡排序对我们以后学习其他的排序有很大的帮助
# 冒泡排序
# 列表每相邻的数,如果前面比后面大,则交换这两个数
# 一趟排序完成后,则无序区减少一个数,有序增加一个数
import random
def bubble_sort(li):
for i in range(len(li)-1):
for j in range(len(li)-i-1):
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
# 优化
# 当数据不再交换的时候,排序已经完成,就可以结束循环,减少时间
from cal_time import cal_time
def bubble_sort(li):
for i in range(len(li)-1):
exchange = False
for j in range(len(li)-i-1):
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
exchange = True
if not exchange:
return
# 测试
# 使用random随机模块
# 列表生成式
li =[random.randint(1,10000) for i in range(1000)]
print(li)
bubble_sort(li)
print(li)
lit = list(range(10000))
# random.shuffle(lit) 打乱列表
random.shuffle(lit)
bubble_sort(lit)
选择排序
时间复杂度 O(n^2^)
选择排序的时间复杂度和空间复杂度都比较高,
# 选择排序
# 简陋写法
# 确定,时间复杂度高,空间复杂度高 非原地排序
import random
def select_sort_simple(li):
li_new = []
for i in range(len(li)):
min_val = min(li)
li_new.append(min_val)
li.remove(min_val)
return li_new
# 优化
# 算法关键: 有序区和无序区, 记录无序区最小数的位置
def select_sort(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]
lit = list(range(10000))
# random.shuffle(lit) 打乱列表
random.shuffle(lit)
select_sort(lit)
插入排序
时间复杂度 O(n^2^)
将所有的元素看成扑克牌,选则排序就象对摸到的扑克牌进行排序一样, 第一个元素看成底牌,后面的元素为未知的
每次摸一张牌 从右向左依次比较,当所摸得牌大于比较所比较的牌 将摸到的牌放在所比较的牌的右面 当所摸得牌小于比较所比较的牌,所比较的牌向右移动一个位置,腾出位置,然后继续进行比较,
import random
from cal_time import *
@cal_time
def insert_sort(li):
for i in range(1, len(li)):
tmp = li[i]
j = i-1
# 找插入的位置
# 从右往左比较,如果tmp小于l[j],l[j]他的位置就向右移一个位置,
while j >= 0 and li[j] > tmp:
li[j+1] = li[j]
j = j-1
li[j+1] = tmp
li = [1,5,9,6,4,9,4,5,5,9,4,6]
insert_sort(li)
print(li)
lit = list(range(10000))
# random.shuffle(lit) 打乱列表
random.shuffle(lit)
insert_sort(lit)