冒泡排序
时间复杂度 O(n2)
# 冒泡排序 # 列表每相邻的数,如果前面比后面大,则交换这两个数 # 一趟排序完成后,则无序区减少一个数,有序增加一个数 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(n2)
# 选择排序 # 简陋写法 # 确定,时间复杂度高,空间复杂度高 非原地排序 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(n2)
# 插入排序 时间复杂度为O(n*n) ''' 将所有的元素看成扑克牌,选则排序就象对摸到的扑克牌进行排序一样, 第一个元素看成底牌,后面的元素为未知的 每次摸一张牌 从右向左依次比较,当所摸得牌大于比较所比较的牌 将摸到的牌放在所比较的牌的右面 当所摸得牌小于比较所比较的牌,所比较的牌向右移动一个位置,腾出位置,然后继续进行比较, ''' 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)