from turtle import left
def bubble_sort(alist):
"""
冒泡排序法实现升序排序
"""
n = len(alist)
for j in range(n - 1): # 大循环控制每个数都进行冒泡
for i in range(n - 1 - j): # 具体的冒泡排序
if alist[i] > alist[i + 1]:
alist[i + 1], alist[i] = alist[i], alist[i + 1]
def selection_sort(alist):
"""
选择排序法实现升序排序
"""
n = len(alist)
for j in range(n - 1): # 因为数组的长度为n, 所以我们需要比较n次(这里的n从0开始)
min_idx = j # 第j的空位(从头到尾, 每个空位都需要填满数)
for i in range(j + 1, n): # j前面的数已经空位已经满了,从j+1开始是因为没有必要自己和自己比较
if alist[min_idx] > alist[
i]: # 因为是升序排序,如果我们的空位数的值比其他数大,那么把min_idx换了,再接着比较
min_idx = i
# 比较完毕,说明此时的min_idx是最小的数,因此让它去填补空位
alist[j], alist[min_idx] = alist[min_idx], alist[j]
def insertion_sort(alist):
"""
插入排序实现升序排序
"""
n = len(alist)
for i in range(
1,
n): # i ∈ [1, n-1] -> 比较n-1次(这里i从1开始是因为下一个for循环是从逆着来的,逆着的索引是从1开始的)
for j in range(i, 0, -1): # 从第i个元素从后往前数(步长为1)
if alist[j] < alist[j - 1]: # 只有有比自己小的,立马交互位置
alist[j], alist[j - 1] = alist[j - 1], alist[j]
def quick_sort(alist, first, last):
"""
使用快速排序实现升序排序
"""
if first >= last: # 递归的终止条件(当first == last时,序列中只有一个元素;当first > last -> 左边的指针都跑到右边指针的右方了,停止)
return
mid_value = alist[first] # 存放中间值
low = first # 左边的指针
high = last # 右边的指针
while low < high: # low和high没有相遇
while low < high and alist[high] >= mid_value:
high -= 1 # high指针继续走
# while循环结束,说明此时high走不动了
alist[low] = alist[high]
while low < high and alist[low] < mid_value:
low += 1 # low指针继续走
# while循环退出,说明此时low走不动了
alist[high] = alist[low]
# 退出大的while循环,说明此时low和high相遇 -> alist[low] == alist[high]
alist[low] = mid_value # 将一开始存放的值放到对的位置上
# 此时序列被分为了两个,接下来使用递归分别对两边的序列执行快排
quick_sort(alist, first, low - 1)
quick_sort(alist, low + 1, last)
def shell_sort(alist):
"""
使用希尔排序实现升序排序
"""
n = len(alist)
gap = n // 2
i = None # 这里的i是一个占位符
while gap > 0:
for j in range(gap, n): # 这里其实就是插入排序
i = j
while i > 0:
if alist[i] < alist[i - gap]:
alist[i], alist[i - gap] = alist[i - gap], alist[i]
i -= gap
else:
break
gap //= 2
def merge_sort(alist):
"""
使用归并排序实现升序排序
"""
n = len(alist)
if n <= 1: # 拆分到每个序列的长度为1时 -> 停止拆分
return alist
mid = n // 2
left_ls = merge_sort(alist[:mid])
right_ls = merge_sort(alist[mid:])
left_cursor, right_cursor = 0, 0 # 两个指针都指向序列的开头
res = [] # 存放排序结果
while left_cursor < len(left_ls) and right_cursor < len(right_ls):
if left_ls[left_cursor] <= right_ls[right_cursor]: # 对两个指针的值进行比较
res.append(left_ls[left_cursor]) # 将小的值取出来
left_cursor += 1
else:
res.append(right_ls[right_cursor]) # 将小的值取出来
right_cursor += 1
# 退出循环,将两个数组后面的数追加到结果中
res += left_ls[left_cursor:]
res += right_ls[right_cursor:]
return res
if __name__ == "__main__":
ls_bubble = [54, 26, 93, 17, 77, 31, 44, 55, 20]
bubble_sort(ls_bubble)
print(ls_bubble) # [17, 20, 26, 31, 44, 54, 55, 77, 93]
ls_selection = [54, 26, 93, 17, 77, 31, 44, 55, 20]
selection_sort(ls_selection)
print(ls_selection) # [17, 20, 26, 31, 44, 54, 55, 77, 93]
ls_insertion = [54, 26, 93, 17, 77, 31, 44, 55, 20]
insertion_sort(ls_insertion)
print(ls_insertion) # [17, 20, 26, 31, 44, 54, 55, 77, 93]
ls_quick = [54, 26, 93, 17, 77, 31, 44, 55, 20]
quick_sort(ls_quick, first=0, last=len(ls_quick) - 1)
print(ls_quick) # [17, 20, 26, 31, 44, 54, 55, 77, 93]
ls_shell = [54, 26, 93, 17, 77, 31, 44, 55, 20]
shell_sort(ls_shell)
print(ls_shell) # [17, 20, 26, 31, 44, 54, 55, 77, 93]
ls_merge = [54, 26, 93, 17, 77, 31, 44, 55, 20]
new_ls = merge_sort(ls_merge)
print(new_ls) # [17, 20, 26, 31, 44, 54, 55, 77, 93]
六大排序代码实现
最新推荐文章于 2024-07-19 15:45:46 发布