十大排序算法的python实现(二:选择排序和堆排序)

编程小白最近在学习算法,自己用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]

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值