编程小白最近在学习算法,自己用python写了十大排序算法,发出来供大家参考。如有不足之处,欢迎批评讨论。
第三是两种插入排序:直接插入排序和堆排序。
from math import ceil
def insertSort(nums: list) -> list:
"""
插入排序
:param nums:待排序序列
:return:排序后序列(注意:原地排序,返回原来的列表对象)
"""
# 遍历从第二个元素到最后一个元素,因为第一个元素本身已处于排序状态
for i in range(1, len(nums)):
currentVal = nums[i]
position = i
# 向前寻找插入的正确位置,条件:必须还未到达列表开头,并当前位置的前一个元素大于当前需要插入的值
while position > 0 and nums[position - 1] > currentVal:
nums[position] = nums[position - 1] # 将元素后移,为当前需要插入的元素腾出空间
position -= 1
nums[position] = currentVal # 插入当前元素到正确位置
return nums
def shellSort(nums: list) -> list:
"""
希尔排序
:param nums:待排序序列
:return:排序后序列(注意:原地排序,返回原来的列表对象)
"""
step = len(nums) // 2 # 初始步长设置为列表长度的一半
while step > 0:
# 遍历每个分组,组数向上取整
for group in range(ceil(len(nums) / step)):
nums[group::step] = insertSort(nums[group::step]) # 使用切片操作来获取当前分组的元素,步长为当前的步长,并对每个分组应用插入排序
step //= 2 # 步长缩减到原来的一半,逐步减小分组大小,直到步长为1
return nums
if __name__ == '__main__':
from random import choices
nums = list(choices(range(100), k=10))
print('Before sorting:', nums)
print('After insertSort sorting:', insertSort(nums))
print('After shellSort sorting:', shellSort(nums))
输出:
Before sorting: [41, 93, 9, 37, 71, 49, 65, 66, 38, 99]
After insertSort sorting: [9, 37, 38, 41, 49, 65, 66, 71, 93, 99]
After shellSort sorting: [9, 37, 38, 41, 49, 65, 66, 71, 93, 99]