堆排序原理及算法代码详解

yizhihongxing

堆排序原理及算法代码详解

堆排序属于一种选择排序,它的基本思想是利用堆这种数据结构来进行排序。

堆的概念

堆(Heap)是一个特殊的树形数据结构,它有以下两种类型:

  • 大根堆:每个节点的值都大于或等于其左右孩子节点的值。
  • 小根堆:每个节点的值都小于或等于其左右孩子节点的值。

通过对堆进行操作,可以得到堆排序算法。

堆排序的基本思想

  • 将待排序序列构造成一个大根堆。
  • 此时,整个序列的最大值就是堆顶的根节点。
  • 将它和堆数组的末尾元素交换,这样末尾就是最大值了。
  • 然后将剩余的n-1个元素重新构造成一个堆,这样就会得到n个元素中的次大值。
  • 如此反复进行交换、重建大根堆的操作,直到整个序列有序。

堆排序的算法实现

下面是基于python语言实现的堆排序算法代码:

# heapify函数为创建大根堆的过程
# 功能:将序列转化为大根堆
# i:表示一个根节点的下标
# n:表示序列的长度,保证待调整的左、右子树都已经是大根堆
def heapify(arr, n, i):
    largest = i  # 初始化根节点为最大值
    l = 2 * i + 1   # 左子节点的下标
    r = 2 * i + 2   # 右子节点的下标

    # 如果左子树下标在序列中 and
    # 左子树的值大于根节点的值
    if l < n and arr[i] < arr[l]:
        largest = l

    # 如果右子树下标在序列中 and
    # 右子树的值大于根节点和左子树的值
    if r < n and arr[largest] < arr[r]:
        largest = r

    # 如果最大值不是根节点,就交换它们
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]  # 交换根节点和最大值
        heapify(arr, n, largest)

# heapSort函数为堆排序函数
# 功能:对整个序列进行排序
def heapSort(arr,n):

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

    # 从末尾开始排序
    for i in range(n - 1, 0, -1):
        arr[0], arr[i] = arr[i], arr[0]    # 交换根节点和末尾元素
        heapify(arr, i, 0)    # 重新构造大根堆

堆排序示例说明:

将以下序列进行排序:[12, 11, 13, 5, 6, 7]

  • 构造大根堆,序列变为[13, 11, 12, 5, 6, 7],堆顶元素为13
  • 交换堆顶元素13和末尾元素7,此时序列变为[7, 11, 12, 5, 6, 13],排除末尾元素7后重新构造大根堆,序列变为[12, 11, 7, 5, 6],堆顶元素为12
  • 交换堆顶元素12和末尾元素6,此时序列变为[6, 11, 7, 5, 12],排除末尾元素6后重新构造大根堆,序列变为[11, 5, 7, 6],堆顶元素为11
  • 交换堆顶元素11和末尾元素5,此时序列变为[5, 6, 7, 11],排除末尾元素5后重新构造大根堆,序列变为[7, 6, 5],堆顶元素为7
  • 交换堆顶元素7和末尾元素5,此时序列变为[5, 6, 7],排除末尾元素5后重新构造大根堆,序列变为[6, 5],堆顶元素为6
  • 交换堆顶元素6和末尾元素5,此时序列变为[5, 6],排除末尾元素5后重新构造大根堆,序列变为[5],堆顶元素为5
  • 排序完成,最终序列为[5, 6, 7, 11, 12, 13]

以上是堆排序原理及算法代码的详细讲解,如有不明白的地方,可随时进行提问。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:堆排序原理及算法代码详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • MySQL排序原理和案例详析

    MySQL排序的原理主要包括内部排序和外部排序两种方式。内部排序主要用于处理较小的数据集,而外部排序则专门用于处理大型数据集。 在内部排序中,MySQL主要采用快速排序算法进行排序。快速排序是一种常用的分治算法,其核心思想是通过将一个大问题分解成多个小问题并逐步解决,最终将所有小问题关键字的排序结果合并起来得到整个序列的有序排列。 在外部排序中,MySQL采…

    算法与数据结构 2023年5月19日
    00
  • C语言直接选择排序算法详解

    C语言直接选择排序算法详解 什么是选择排序算法 选择排序算法(Selection Sort)是一种简单直观的排序算法。该算法每次从未排序的数中选择最小(或最大)的一个数,将其放在已排序数列的末尾,直到所有数排序完成。因为该算法在每次排序后的下一轮排序不会再考虑之前选择的最小(或最大)值,所以属于不稳定排序算法。 算法流程 选择排序算法主要分为两个步骤: 在未…

    算法与数据结构 2023年5月19日
    00
  • C语言实现单链表的快速排序算法

    下面是详细的攻略: 单链表快速排序算法的原理 在单链表上实现快速排序,需要了解快速排序算法的原理。快速排序是一种常用的基于比较的排序算法,它的基本思想是:选取一个基准元素(pivot),将数组分成两个部分,一个部分是小于基准元素的,一个部分是大于基准元素的。然后对这两个部分分别递归进行快排,最终得到排序后的数组。 在单链表上,选择基准元素也是一样的,不同的是…

    算法与数据结构 2023年5月19日
    00
  • 华为笔试算法题汇总

    下面是“华为笔试算法题汇总”的完整攻略: 一、题目来源 本篇攻略总结了华为笔试中常见的算法题目,这些题目可以在华为科技招聘官网上的笔试环节中出现。 二、题目类型 华为笔试中常见的算法题目主要包括: 字符串操作:如字符串反转、字符串查找等; 数组排序:如快排、归并排序等; 链表操作:如链表反转、链表合并等; 动态规划问题:如背包问题、最长公共子序列等; 图论问…

    算法与数据结构 2023年5月19日
    00
  • 算法之排序算法的算法思想和使用场景总结

    算法之排序算法的算法思想和使用场景总结 一、引言 排序算法是计算机科学基础中的一个重要的部分。随着数据规模的增大,如何高效地对数据进行排序也成为了计算机科学中的重要问题。各种排序算法针对不同的数据结构和数据规模,具有不同的时间和空间复杂度。通过了解不同的排序算法的算法思想和使用场景,可以帮助我们更好地选择合适的排序算法。 二、排序算法的分类 常见的排序算法可…

    算法与数据结构 2023年5月19日
    00
  • C++中的几种排序算法

    下面就C++中几种常用的排序算法进行详细的讲解。 一、冒泡排序 冒泡排序是一种基本排序算法,也是入门级别的排序算法。其基本思想就是对于一组待排序的数据,通过不断地比较相邻两个元素的大小关系,并对需要调整位置的元素进行交换,来达到排序的目的。 C++代码实现: void bubble_sort(int arr[], int n) { for (int i = …

    算法与数据结构 2023年5月19日
    00
  • 常用的 JS 排序算法 整理版

    下面是对“常用的JS排序算法 整理版”的完整攻略的详细讲解。 一、排序算法介绍 排序是计算机科学中的一个基本问题,它的目的是对一组元素进行升序或降序排列。JS中常用的排序算法包括 冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序等。 二、常用排序算法示例 下面是两个常用排序算法的示例: 1. 冒泡排序 冒泡排序是一种简单的排序算法,它重复遍历要排序…

    算法与数据结构 2023年5月19日
    00
  • JavaScript实现基础排序算法的示例详解

    JavaScript实现基础排序算法的示例详解 排序算法可以说是计算机科学中最基础的算法之一。而对于前端开发者来说,掌握一些简单的排序算法是很有必要的,因为它们可以帮助我们解决很多实际问题,如搜索结果排序、排名等。在这里,我们将讲解JavaScript如何实现基础排序算法。 冒泡排序 冒泡排序是最简单的排序算法之一。它将数组中的元素两两比较,如果顺序不正确就…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部