一、排序
1.直接插入排序
def straight_insertion_sort(values):#f,i,w
"""直接插入排序"""
"""将1号到n-1号数依次插入前面已排好的有序序列中(序号从0号开始到n-1号),比前驱小则前驱后移继续
向前比较,比前驱大则插入,重复这个过程n-1次。(适合基本有序,数据量不大)"""
for i in range(1,len(values)):#依次将1~n个号数插入前面已排序序列
if values[i] < values[i - 1]:
#若values[i]的关键码小于前驱,需将values[i]插入有序表
temp = values[i]#暂存
j = i - 1
while values[j] > temp and j >= 0:#从后往前查找待插入位置
values[j + 1] = values[j]#往后挪位
j -= 1
values[j + 1] = temp#复制到插入位置
return values
2.折半插入排序
def binary_insertion_sort(values):#f,w,i,e,f
"""折半插入排序"""
for i in range(1,len(values)): #依次将1-n插入前面已排序序列
temp = values[i]#暂存
low = 0
high = i - 1#设置折半查找范围
while low <= high:#折半查找,先找到目标插入位置low
mid = (low + high) // 2#取中间点('/'表示浮点数除法,'//'表示整数除法)
if temp > values[mid]:#查右半子表
low = mid + 1
else:#查左半子表
high = mid - 1
for j in range(i,low,-1):#统一后移元素,空出插入位置
values[j] = values[j - 1]
values[low] = temp#插入操作
print(values)
3.希尔排序
def shell_sort(values):
"""希尔排序"""
""""取一个小于n的步长d1,所有距离为d1的倍数的记录放在同一个组,分组后按直接插入排序的规则排序,
然后再取的第二个步长d2=d1/2,重复以上过程直至步长为1。(仅适用顺序存储的线性表)"""
n = len(values)
gap = n//2
while gap > 0:
for i in range(gap,n):
while i >= gap and values[i] < values[i - gap]:
values[i],values[i - gap] = values[i - gap],values[i],values[i]
i -= gap
gap //= 2
return values
4.冒泡排序
def bubble_sort(values):#f,f,i,i
"""冒泡排序"""
""""原则上进行n-1趟比较,若为第i趟排序,则将0号到n-i-1号序列中的数j号与j+1号比较,若为顺序,
则j+1号与j+2号比较,以此类推,若为逆序则交换,将交换后的数以此继续向后比较,若本趟没有发生交换则
表已有序。"""
for i in range(len(values) - 1):#冒泡趟数
flag = False#表示本趟冒泡是否发生交换的标志
for j in range(len(values) - i - 1):#一趟冒泡过程
if values[j] > values[j + 1]:#若为逆序
values[j],values