一:冒泡排序
时间复杂度:O(n2)
原理:
(1):相邻元素互相比较 如果第一个比第二个大 就交换两者的位置
(2):对每一对邻居做比较 从头走到尾 即走了一趟 最后一位元素即为最大的元素
(3):针对所有的元素重复以上步骤 除了最后一个(因为最后的一位元素已经选出来了 为最大的元素 不需要再比较)
(4):持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较,最后数列就是从大到小一次排列
from cal_time import * import random @cal_time def bubble_sort(li): # li 传入的无序列表 for i in range(len(li) - 1): # i表示执行多少趟 for j in range(len(li) - i - 1): # 第i趟 无序区范围[0, n-i-1] j表示箭头即倒数第二个位置 0~n-i-2 n代表列表长度 if li[j] > li[ j + 1]: # 如果当前位置比邻居位置大 li[j] , li[j + 1] = li[j+1], li[j] return li li = list(range(100)) random.shuffle(li) print("pre:", li) bubble_sort(li) print("after:", li) 冒泡排序 冒泡排序
优化版本:当某一趟走完以后发现并没有进行数据交换,那么此时的数列已经排列好了,没有必要在进行下去。例如:极端情况下,数列本来已经排序好的,我们只需要走一趟即可完成排序。
from cal_time import * import random @cal_time def bubble_sort(li): # li 传入的无序列表 for i in range(len(li) - 1): # i表示执行多少趟 exchange = False # 交换标志 for j in range(len(li) - i - 1): # 第i趟 无序区范围[0, n-i-1] j表示箭头即倒数第二个位置 0~n-i-2 因为顾头不顾尾 因此范围为len - i - 1 n代表列表长度 if li[j] > li[ j + 1]: # 如果当前位置比邻居位置大 li[j] , li[j + 1] = li[j+1], li[j] exchange = True # 改变标志 if not exchange: return return li li = list(range(100)) random.shuffle(li) print("pre:", li) bubble_sort(li) print("after:", li) 优化版冒泡排序 优化版冒泡排序
二:选择排序
时间复杂度:O(n2)
原理:
(1)每次从列表中选出一个数作为比较的参数,并且将其与其余数字进行比较
(2)若列表中的某个数字比选中的元素小 则二则交换位置
(3)依次将列表进行循环 选出最小的数 放在最左边
(4)重复上述步骤 直至完成排序
from cal_time import * import random # 选出最小元素的位置索引 def get_min_pos(li): min_position_index = 0 # 设置初始位置索引 for i in range(1, len(li)): # 循环列表 if li[i] < li[min_position_index]: # 比较循环出来的数值 与初始位置数值大小 min_position_index = i # 如果 循环出来的数值小于初始位置 则两则调换下位置 return min_position_index # 返回上述索引 @cal_time def select_sort(li): for i in range(len(li) - 1): # 循环n次或者n - 1次都可以 min_index = i # 记录循环开始最小的数值索引 # 此时无序区的范围为 [i - len(li)] 因为每次循环都会选出一个最小的放在最左边 下次开始在一个新的列表进行循环 for j in range(i + 1, len(li)): # 新的列表开始位置为i 自己不需要与自己比 因此从 i + 1开始进行计算 if li[j] < li[min_index]: # 比较初始索引值 与循环出来的值大小 min_index = j # 如果上述条件成立 则循环出来的数小于初始值数 因此换下位置 li[i], li[min_index] = li[min_index], li[i] # 最后进行位置互换 data_list = list(range(100)) random.shuffle(data_list) # 打乱列表数据 print("pre:", data_list) select_sort(data_list) print("after:", data_list)
三:插入排序
pass