1- 十大排序算法(选择排序、冒泡排序、插入排序)
一、选择排序
-
选择排序:一共执行n-1轮操作;第i轮找到第i小的数;放到第i个位置;计算量0(n2)
-
找最小的数, 放在最左侧第1个位置
-
找第2小的数,放在第2个位置

- 以此类推,找第n大的数,放在第n个位置。
python
def selection_sort():
# 使用全局变量 a 和 n
global a, n
# 外层循环:遍历每个元素,确定当前位置的最小值
for i in range(n - 1):
m = i # 假设当前位置 i 是最小值的位置
# 内层循环:从当前位置的下一个元素开始遍历,寻找最小值
for j in range(i + 1, n):
if a[j] < a[m]: # 如果找到了比当前位置 m 更小的元素
m = j # 更新最小值的位置为 j
# 交换当前位置和最小值位置的元素
a[i], a[m] = a[m], a[i]
# 读取输入的数值个数 n 和元素列表 a
n = int(input()) # 读取列表的大小
a = list(map(int, input().split())) # 读取列表元素
selection_sort() # 调用选择排序函数
print(*a) # 打印排序后的列表
二、冒泡排序
-
选择排序:共n-1轮冒泡;每一轮冒泡:把这轮的最大值放到a[i-1];计算量0(n2)
-
第一轮冒泡:比较a[0]和a[1],如果a[0]>a[1],交换。前2个数中的大数放到了第2个位置.
-
比较a[1]和a[2],如果a[1]>a[2],交换。把前3个数中的最大数放到了第3个位置。

python
def bubble_sort(arr):
n = len(arr) # 获取列表的长度
# 外层循环,控制排序的趟数,每一趟会将一个最大值放到最后
for i in range(n):
# 内层循环,用于在每一趟中比较相邻的元素
for j in range(0, n-i-1): # 每次比较到倒数第 i 个元素,因为最后的 i 个元素已经排好
# 如果前一个元素大于后一个元素,则交换它们
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j] # 交换相邻元素
return arr # 返回排序后的列表
# 输入一个数字列表
arr = list(map(int, input("请输入数字,用空格分隔:").split()))
sorted_arr = bubble_sort(arr) # 调用冒泡排序函数
print("排序后的列表:", sorted_arr) # 输出排序后的列表
三、插入排序(可以理解成打牌)
-
插入排序:在一个有序数列上,逐个新增数据,当新增一个数x时,把它插入到有序数列中的合适位置,使
数列仍保持有序。插n次,每次可能调整0(n)个数计算量0(n2)
-
以{3,7.4,5,6,1,8, 2}为例。
-
从第一个数a[0]开始。
-
新增a[1],把它插到有序数列{a[0]}中。
-
新增a[2],把它插到有序数列{a[0],a[1]}中。
-
python
def insertion_sort(arr):
# 从第二个元素开始,假设第一个元素已经排好
for i in range(1, len(arr)):
key = arr[i] # 保存当前要插入的元素
j = i - 1 # 从当前元素的前一个元素开始,准备查找插入位置
# 移动元素,直到找到插入的位置
while j >= 0 and arr[j] > key:
arr[j + 1] = arr[j] # 把比key大的元素向右移动
j -= 1 # 继续向前查找
arr[j + 1] = key # 插入当前元素到正确的位置
# 输入一个数字列表
arr = list(map(int, input("请输入数字,用空格分隔:").split()))
insertion_sort(arr) # 调用插入排序函数
print("排序后的列表:", arr) # 输出排序后的列表