前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 算法基础篇:堆排序和计数排序

Python 算法基础篇:堆排序和计数排序

作者头像
小蓝枣
发布2023-07-24 15:12:59
1050
发布2023-07-24 15:12:59
举报
文章被收录于专栏:CSDN博客专家-小蓝枣的博客

Python 算法基础篇:堆排序和计数排序

引言

堆排序和计数排序是两种高效的排序算法,用于将一个无序列表按照特定顺序重新排列。本篇博客将介绍堆排序和计数排序的基本原理,并通过实例代码演示它们的应用。

😃😄 ❤️ ❤️ ❤️

1. 堆排序算法概述

堆排序是一种基于堆数据结构的排序算法,它将列表构建成一个二叉堆,并通过不断移除堆顶元素来得到有序列表。堆排序的核心思想是利用堆数据结构的特性,使得每次移除堆顶元素后,剩余元素仍然构成一个合法的堆。

堆排序的主要优点是稳定且效率高,时间复杂度为 O ( n log n ),适用于处理大规模数据的排序。

2. 堆排序算法实现

实例1:堆排序

代码语言:javascript
复制
def heapify(arr, n, i):
    largest = i        # 初始化最大元素的索引
    left_child = 2 * i + 1
    right_child = 2 * i + 2

    # 判断左子节点是否大于根节点
    if left_child < n and arr[i] < arr[left_child]:
        largest = left_child

    # 判断右子节点是否大于根节点
    if right_child < n and arr[largest] < arr[right_child]:
        largest = right_child

    # 如果最大元素不是根节点,则交换它们,并继续堆化
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)

def heap_sort(arr):
    n = len(arr)

    # 构建最大堆
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)

    # 依次移除堆顶元素,并进行堆化
    for i in range(n - 1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]   # 交换堆顶元素和最后一个元素
        heapify(arr, i, 0)   # 对剩余元素进行堆化

# 测试堆排序
arr = [64, 34, 25, 12, 22, 11, 90]
heap_sort(arr)
print("堆排序结果:", arr)

代码解释:上述代码演示了使用堆排序对一个列表进行排序的实例。堆排序首先将列表构建成一个最大堆,然后不断移除堆顶元素,将其放在有序部分的末尾,并继续堆化剩余元素。通过使用 heapify 函数来维护堆的性质。

3. 计数排序算法概述

计数排序是一种非比较排序算法,它通过统计列表中每个元素的出现次数,然后根据统计结果将元素放回原来的位置,从而得到有序列表。

计数排序的主要优点是适用于排序范围较小的整数列表,时间复杂度为 O ( n + k ),其中 n 为列表长度, k 为列表中元素的最大值减去最小值。

4. 计数排序算法实现

实例2:计数排序

代码语言:javascript
复制
def counting_sort(arr):
    max_val = max(arr)
    min_val = min(arr)
    range_val = max_val - min_val + 1

    # 统计列表中每个元素的出现次数
    count = [0] * range_val
    for num in arr:
        count[num - min_val] += 1

    # 根据统计结果构建有序列表
    sorted_arr = []
    for i in range(range_val):
        for j in range(count[i]):
            sorted_arr.append(i + min_val)

    return sorted_arr

# 测试计数排序
arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = counting_sort(arr)
print("计数排序结果:", sorted_arr)

代码解释:上述代码演示了使用计数排序对一个列表进行排序的实例。计数排序通过统计列表中每个元素的出现次数,然后根据统计结果构建有序列表。通过遍历统计数组,将元素放回原来的位置,实现了计数排序算法。

5. 堆排序与计数排序的对比

堆排序和计数排序都是高效的排序算法,它们分别适用于不同类型的排序需求:

  • 堆排序适用于处理大规模数据的排序,它的时间复杂度为 O ( n log n ),稳定且效率高。然而,堆排序需要构建堆数据结构,可能需要额外的存储空间。
  • 计数排序适用于排序范围较小的整数列表,它的时间复杂度为 O ( n + k ),其中 k 为列表中元素的最大值减去最小值。计数排序不涉及比较操作,不需要额外的存储空间,因此在适用范围内具有较高的效率。

总结

本篇博客介绍了堆排序和计数排序两种高效的排序算法。堆排序通过构建最大堆,不断移除堆顶元素得到有序列表;计数排序通过统计元素出现次数,将元素放回原来的位置得到有序列表。

这两种排序算法在处理大规模数据和排序范围较小的整数列表时都有较高的效率,根据具体情况选择合适的排序算法对于提高程序性能非常重要。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python 算法基础篇:堆排序和计数排序
  • 引言
  • 1. 堆排序算法概述
  • 2. 堆排序算法实现
    • 实例1:堆排序
    • 3. 计数排序算法概述
    • 4. 计数排序算法实现
      • 实例2:计数排序
      • 5. 堆排序与计数排序的对比
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档