本文目录导读:

我来详细介绍Python选择排序的实操编写方法。
基础选择排序算法
def selection_sort(arr):
"""
基础选择排序实现
时间复杂度:O(n²)
空间复杂度:O(1)
"""
n = len(arr)
# 遍历所有元素
for i in range(n):
# 假设当前位置i的元素是最小值
min_idx = i
# 在剩余元素中找到最小值
for j in range(i + 1, n):
if arr[j] < arr[min_idx]:
min_idx = j
# 将找到的最小值与当前位置交换
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr
# 测试
test_arr = [64, 34, 25, 12, 22, 11, 90]
print("排序前:", test_arr)
sorted_arr = selection_sort(test_arr)
print("排序后:", sorted_arr)
带详细注释的版本
def selection_sort_detailed(arr):
"""
详细注释版的选择排序
"""
n = len(arr)
print(f"初始数组: {arr}")
print("-" * 40)
for i in range(n):
min_idx = i
print(f"第{i+1}轮: 当前位置i={i}, 值={arr[i]}")
# 在未排序部分查找最小值
for j in range(i + 1, n):
if arr[j] < arr[min_idx]:
min_idx = j
# 如果找到了更小的值,进行交换
if min_idx != i:
print(f" 找到最小值 arr[{min_idx}] = {arr[min_idx]}, 与 arr[{i}] = {arr[i]} 交换")
arr[i], arr[min_idx] = arr[min_idx], arr[i]
print(f" 交换后数组: {arr}")
else:
print(f" arr[{i}] 已是最小值,无需交换")
print(f"第{i+1}轮结束: {arr}")
print("-" * 40)
return arr
# 测试详细版本
test_arr = [64, 34, 25, 12, 22, 11, 90]
selection_sort_detailed(test_arr.copy())
降序选择排序
def selection_sort_descending(arr):
"""
降序选择排序
"""
n = len(arr)
for i in range(n):
# 找最大值,而不是最小值
max_idx = i
for j in range(i + 1, n):
if arr[j] > arr[max_idx]: # 改为大于号
max_idx = j
arr[i], arr[max_idx] = arr[max_idx], arr[i]
return arr
# 测试降序
test_arr = [64, 34, 25, 12, 22, 11, 90]
print("升序:", selection_sort(test_arr.copy()))
print("降序:", selection_sort_descending(test_arr.copy()))
选择排序的变体 - 同时选择最大最小值
def selection_sort_bidirectional(arr):
"""
双向选择排序:同时找到最大和最小值
"""
n = len(arr)
left = 0
right = n - 1
while left < right:
min_idx = left
max_idx = right
# 在范围内同时查找最大和最小值
for i in range(left, right + 1):
if arr[i] < arr[min_idx]:
min_idx = i
if arr[i] > arr[max_idx]:
max_idx = i
# 将最小值放到左边
if min_idx != left:
arr[left], arr[min_idx] = arr[min_idx], arr[left]
# 如果最大值被移动到最小值位置了,更新最大值索引
if max_idx == left:
max_idx = min_idx
# 将最大值放到右边
if max_idx != right:
arr[right], arr[max_idx] = arr[max_idx], arr[right]
left += 1
right -= 1
return arr
# 测试双向选择排序
test_arr = [64, 34, 25, 12, 22, 11, 90]
print("双向选择排序:", selection_sort_bidirectional(test_arr.copy()))
选择排序性能测试
import time
import random
def test_performance():
"""测试不同规模数据的性能"""
sizes = [100, 1000, 5000]
for size in sizes:
# 生成随机数组
arr = [random.randint(1, 10000) for _ in range(size)]
# 计时
start_time = time.time()
selection_sort(arr.copy())
end_time = time.time()
print(f"数据规模 {size}: {end_time - start_time:.4f} 秒")
# 运行性能测试
test_performance()
选择排序的实际应用示例
def sort_students_by_grade(students):
"""
使用选择排序对学生成绩进行排序
"""
n = len(students)
for i in range(n):
min_idx = i
for j in range(i + 1, n):
if students[j]['grade'] < students[min_idx]['grade']:
min_idx = j
students[i], students[min_idx] = students[min_idx], students[i]
return students
# 测试学生成绩排序
students = [
{'name': '张三', 'grade': 85},
{'name': '李四', 'grade': 92},
{'name': '王五', 'grade': 78},
{'name': '赵六', 'grade': 95},
{'name': '刘七', 'grade': 88}
]
sorted_students = sort_students_by_grade(students.copy())
print("按成绩排序:")
for student in sorted_students:
print(f"{student['name']}: {student['grade']}分")
选择排序的优缺点
def selection_sort_analysis():
"""
选择排序分析
"""
analysis = {
"时间复杂度": {
"最好情况": "O(n²) - 即使已经排好序,也需要比较所有元素",
"最坏情况": "O(n²) - 逆序排列时",
"平均情况": "O(n²)"
},
"空间复杂度": "O(1) - 原地排序",
"稳定性": "不稳定 - 相同元素可能会交换位置",
"比较次数": "n(n-1)/2 次比较",
"交换次数": "n-1 次交换(最好情况也是n-1次)"
}
print("选择排序分析:")
for key, value in analysis.items():
print(f"{key}: {value}")
selection_sort_analysis()
实操建议:
- 代码调试:使用print语句查看每一轮的变化
- 边界测试:测试空数组、单元素数组、已排序数组
- 性能优化:对于小规模数据(<1000)选择排序性能尚可
- 实际应用:适合数据量小或对内存要求严格的场景
选择排序虽然效率不高,但实现简单、逻辑清晰,是理解排序算法的重要基础。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播