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

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

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

堆的概念

堆(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日

相关文章

  • 归并排序时间复杂度过程推导详解

    归并排序时间复杂度过程推导详解 什么是归并排序 归并排序是一种基于分治思想的排序算法,将一个无序的数组划分成若干子数组,对每个子数组进行排序,然后再将排好序的子数组进行合并,最终得到一个完整有序的数组。 归并排序的时间复杂度 归并排序的时间复杂度是O(nlogn),其中n表示数组的长度。接下来我们将详细讲解归并排序的时间复杂度推导过程。 假设有一个长度为n的…

    算法与数据结构 2023年5月19日
    00
  • JS使用单链表统计英语单词出现次数

    下面是JS使用单链表统计英语单词出现次数的完整攻略。 1. 理解单链表 单链表是一种常见的数据结构,也是一种线性结构,其中每个节点只有一个指针,指向它的后继节点。单链表一般由头指针和头结点组成,头结点不存放任何实际数据。在单链表中,节点可以进行插入、删除、查找等基本操作,是一种十分常用的数据结构。 2. 思路分析 要使用单链表统计英语单词出现次数,可以将单词…

    算法与数据结构 2023年5月19日
    00
  • C++实现归并排序

    C++实现归并排序 什么是归并排序 归并排序是一种分治策略的排序算法,将待排序的序列切分为若干个子序列,递归地对子序列排序,并将各子序列的排序结果合并成最终有序序列。归并排序的时间复杂度为O(nlogn),是一种高效的排序算法。 归并排序的实现 递归实现 归并排序的递归实现比较容易理解。我们可以将待排序的序列不断切分为更小的子序列,直到子序列长度为1,此时子…

    算法与数据结构 2023年5月19日
    00
  • java如何给对象按照字符串属性进行排序

    在 Java 中,我们可以使用 Collections.sort() 方法对任意类型的对象进行排序。但是,如果我们想要按照对象的某一个字符串属性进行排序,我们可以使用 Comparator 接口来实现。 具体步骤如下: 首先,创建一个 Comparator 对象,重写 compare() 方法,按照需要的属性进行排序。例如,如果我们要按照对象的 name 属…

    算法与数据结构 2023年5月19日
    00
  • JS简单数组排序操作示例【sort方法】

    JS简单数组排序操作示例【sort方法】 操作说明 在JavaScript中,通过数组的sort()方法可以对数组进行排序操作。sort()方法会直接对原数组进行排序,返回排序后的原数组。 sort()方法通常需要传入一个比较函数,来指定排序规则。比较函数接收两个参数,分别表示待比较的两个元素,如果返回值小于0,则表示第一个元素排在第二个元素前面;如果返回值…

    算法与数据结构 2023年5月19日
    00
  • Go语言展现快速排序算法全过程的思路及代码示例

    这里是关于“Go语言展现快速排序算法全过程的思路及代码示例”的详细攻略。 什么是快速排序算法 快速排序算法是一种基于比较的排序算法,它通过选择一个基准元素,将数组分为两部分然后递归地对这两部分进行排序,最终完成对整个数组的排序。快速排序算法的时间复杂度为 O(nlogn) 平均情况下,但是在最坏情况下会退化为 O(n^2)。 快速排序算法的实现思路 下面是快…

    算法与数据结构 2023年5月19日
    00
  • C++九种排序具体实现代码

    针对“C++九种排序具体实现代码”的攻略,我将从以下几个方面进行详细讲解: 九种排序算法介绍 排序算法实现代码示例 一些注意事项 九种排序算法介绍 在介绍具体代码实现之前,我们先来了解一下九种排序算法的特点。 冒泡排序(Bubble Sort):通过不断交换相邻的两个元素,将大的元素逐渐往后移动,最后得到有序序列。 快速排序(Quick Sort):通过设定…

    算法与数据结构 2023年5月19日
    00
  • golang 归并排序,快速排序,堆排序的实现

    Golang 实现归并排序,快速排序和堆排序 简介 排序算法的实现是大多数程序员必备的技能之一。在这个过程中,我们考虑三种经典的排序算法之一:归并排序,快速排序和堆排序。我们在学习它们的同时,也在学习使用 Golang 写出高效的排序算法。 归并排序 算法原理 归并排序是基于归并操作的一种排序算法,该算法的核心思想是将一个数组分成两个较小的数组,然后递归地将…

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