编程小白最近在学习算法,自己用python写了十大排序算法,发出来供大家参考。如有不足之处,欢迎批评讨论。
第二是两种选择排序:直接选择排序和堆排序。
from heapq import heapify, heappop
def selectSort(nums: list) -> list:
"""
选择排序
### 改进建议:
1. **优化算法的变体**:虽然基础选择排序的改进空间有限,但是可以考虑使用双向选择排序等变体,这个算法每次循环同时找到最小值和最大值,可以稍微减少比较和交换的次数。
:param nums:待排序序列
:return:排序后序列(注意:原地排序,返回原来的列表对象)
"""
# 遍历列表的每一个元素,除了最后一个(因为最后一个元素无需比较)
for i in range(len(nums) - 1):
minIndex = i # 将当前位置i设为最小元素的索引
# 从i+1位置开始,向后遍历列表寻找比当前最小元素还小的元素
for j in range(i + 1, len(nums)):
if nums[j] < nums[minIndex]: minIndex = j # 更新最小元素的索引
if minIndex != i: nums[i], nums[minIndex] = nums[minIndex], nums[i] # 如果找到的最小元素不是当前位置的元素,则将其移到当前位置
return nums
def heapSort(nums: list) -> list:
"""
堆排序
:param nums:待排序序列
:return:排序后序列(注意:原地排序,原来的列表对象已被清空)
"""
heapify(nums) # 将nums转换为最小堆
sorted_nums = [] # 创建一个用来存放排序后元素的列表
while nums:
sorted_nums.append(heappop(nums)) # 使用heappop从堆中取出最小的元素,并将其添加到sorted_nums中
return sorted_nums
if __name__ == '__main__':
from random import choices
nums = list(choices(range(100), k=10))
print('Before sorting:', nums)
print('After selectSort sorting:', selectSort(nums))
print('After heapSort sorting:', heapSort(nums))
输出:
Before sorting: [33, 23, 58, 33, 80, 2, 93, 59, 86, 89]
After selectSort sorting: [2, 23, 33, 33, 58, 59, 80, 86, 89, 93]
After heapSort sorting: [2, 23, 33, 33, 58, 59, 80, 86, 89, 93]