LeetCode 堆排序

简介: 笔记

在许多排序的算法中,堆排序还是比较经典的算法,而且其思想很值得我们学习以及我们思考。


堆排序是基于二叉数的一种算法,叫做二叉堆,相较于二叉树不同的是,二叉堆的所有父节点都比子节点要大或者要小。

首先需要引入最大堆的定义:

最大堆中的最大元素值出现在根结点(堆顶)

堆中每个父节点的元素值都大于等于其孩子结点


现在来简要叙述一下创建最大堆的步骤:

1.先假设父节点的元素最大,标记其index

2.比较父节点和left节点的大小,如果left节点大于父节点,则更新index值为left节点的index。

3.如果步骤二不成立,则比较父节点与right节点的大小,若right节点大于父节点,则更新index值为right节点的index。

4.如果步骤三成立,这比较left节点和right节点的大小,若right节点大于left节点,则更新index值为right节点的index。

5.如果步骤三,四都不成立,也就是说index没有更新,则返回。

6.步骤三,四有一个成立,则交换父节点和index标记位置的值,然后以index标记的位置为父节点继续进行以上步骤。


ps:整个步骤都在子节点的index值要小于树的大小减一(数组是从0开始计数的)。

下面是c++的代码

void createheap(int arr[] ,int n ,int i)
{
  int largest = i;  //父节点的值为最大值
  int left = 2*i+1;  //left节点的位置
  int right = 2*i +2; //right节点的位置
  if(left < n && arr[left] > arr[largest])
    largest = left;   //对应步骤二
  if(right < n && arr[right] > arr[largest])
    largest = right;  //对应步骤三
  if(largest != i)  //对应步骤六
  {   
    swap(arr[i],arr[largest]);
    creatheap(arr,n,largest);   //一旦交换,就不知道以该节点为父节点的值是不是最大的,所有又要继续比较。
  }
}

创建最大堆之后,接下来是进行排序。排序的思想可比创建最大堆要复杂一点,但我们也要静下心来,慢慢思考。


简单来说的话也就是一句话的事:把最大堆堆顶的最大数取出,将剩余的堆继续调整为最大堆,再次将堆顶的最大数取出,这个过程持续到剩余数只有一个时结束。(来自LeetCode)


这个具体的步骤我也解释不太清楚,不过你去画一下图你就知道其中的道理了,如果你能熟练地画出来的话,那么你就应该掌握它了。

void sortheap(int arr[],int n);
{
  for(int i = n/2-1;i>=0;i--)
    createheap(arr,n,i);
  for(int i= n-1;i>=0;i--)
  {
    swap(arr[0],arr[i]);  //先交换堆顶与i位置的元素。
    createheap(arr,n,i);  //再次生成最大堆
  }
}

学习于https://mp.weixin.qq.com/s/wqebx4DoeZ-mqA-4uzyFGQ,上面也还有其他的排序算法,大家可以去学习学习。

今天就先分享到这里啦。

thank for your reading ! ! !

公众号:FPGA之旅

目录
相关文章
|
API
LeetCode——数组中的第K个最大元素(堆排序-大顶堆)
LeetCode——数组中的第K个最大元素(堆排序-大顶堆)
180 0
LeetCode——数组中的第K个最大元素(堆排序-大顶堆)
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
63 6
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
55 4
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
124 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
43 1
|
3月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
4月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
72 7
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
55 5
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
32 4