两数交换原理
在了解算法之前先了解两数交换的原理
a,b = b,a 原理: 异或算法
当前元素值: arr[i]
前一个元素: arr[i-1] 后一个元素: arr[i+1]
准备要实验的列表
python
#0.准备列表 --随机列表,范围,长度自定义
import random
def random_list(start, end,length):
arr = []
for i in range(length):
arr.append(random.randint(start, end))
return arr
res = random_list(1,10,5)
print(res)
冒泡排序
原理解析
冒泡排序
元素两两进行比较,每一次排序后较大的值往后移(交换为止)
技巧:排序n-1 每次比较n - 1 - i次
代码展示
python
def bubble_sort(arr):
#控制排序次数
for i in range(len(arr)-1):
#控制比较的次数
for j in range(len(arr)-i-1):
#判断元素大小,将较大的值往后移
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
print(f"第{i + 1}次排序的结果为:{arr}")
return arr
res = bubble_sort(res)
print(res)
选择排序
原理解析
选择排序
1.按索引顺序从0 ~ length-1每次假设一个最小值,获取最小值索引
2.按最小值索引后的元素比较大小,如果后续元素笑了,则记录最小值索引,最后并交换位置
技巧: 总排序次数 length-1
代码展示
python
def selection_sort(arr):
#控制排序次数
for i in range(len(arr) - 1):
#定义最小值的key
key = i #等价于每次假设的索引从0 - length-1
for j in range(i + 1, len(arr)):
#判断后续元素中比假设的key索引对应元素小的话,则记录索引(最小值索引)
if arr[j] < arr[key]:
#记录最小值索引
key = j
arr[i], arr[key] = arr[key], arr[i]
print(f"第{i + 1}次排序的结果为: {arr}")
return arr
res = selection_sort(res)
print(res)
插入排序
原理解析
插入排序
1.从索引为1开始分配已排序和未排序两组
2.将未排序的元素依次和已排序的比较,如果小了则交换位置,直到大了位置,等于插入
代码展示
python
def insertion_sort(arr):
#从第二个元素(索引为1) 开始遍历
for i in range(1, len(arr)):
#记录当前元素
j = i
#控制未排序和已排序的元素进行比较,未排序的为外层索引,已排序的为内层索引
while arr[j-1] > arr[j] and j > 0:
#交换位置
arr[j], arr[j-1] = arr[j-1], arr[j]
#比较上一个元素
j -= 1
print(f"第{i + 1}次排序的结果为: {arr}")
return arr
res = insertion_sort(res)
print(res)
快速排序
原理解析
分治法,选一个 "基准值",将列表分为 "小于基准" 和 "大于基准" 两部分,递归排序子列表
代码展示
python
def quick_sort(arr):
# 递归终止条件:列表长度≤1时无需排序
if len(arr) <= 1:
return arr
# 选择第一个元素作为基准
pivot = arr[0]
# 小于基准的元素
left = [x for x in arr[1:] if x <= pivot]
# 大于基准的元素
right = [x for x in arr[1:] if x > pivot]
# 递归排序左右部分,再合并
return quick_sort(left) + [pivot] + quick_sort(right)
# 测试
sorted_list = quick_sort(res)
print("快速排序结果:", sorted_list) # 输出:[11, 12, 22, 25, 34, 64, 90]
