排序系列之——再叙堆排序

在我之前的文章中:《高效排序之——堆排序,归并排序、快速排序》中初步介绍了堆排序的过程,但是认真的说,自己并没有叙述的十分清楚,这篇博客,我将持续更新,表明堆排序的一个过程和核心思想。

系列博客将按照下面三个问题展开:

  1. 什么是堆?
  2. 为何堆结构可以用来排序?
  3. 怎么利用堆结构进行排序?
  4. 堆排序的算法性能如何?
  5. 总结堆的特性

本文将先回答前两个问题:

  1. 什么是堆结构?

堆结构是一棵完全二叉树,这是堆结构最为根本的性质;当然,我们通常会讨论最大堆结构和最小堆结构。这里以最大堆结构为例,说明最大堆的特点:

上图所示为一个最大堆结构,很明显需要满足以下两点:1 必须满足堆结构的定义:完全二叉树;2 任何一个子节点的值都不大于其父节点的值

第一个问题回答完毕,再来回答第二个问题:为何堆结构可以用来排序?

那么这个问题就要说到优先队列事情了。队列结构——先进先出,而优先队列呢,满足优先级别高的先出。等等,这和堆结构有何关系呢?,

我们来看看上述最大堆结构:最大堆结构 和优先队列联系起来的 纽带是:越上层的父节点,其优先级越高,我们将上述最大堆直接写成一个数组结构:

如果把该数组看成队列结构,那么优先出队列的则是元素“45”。最大堆的性质导致了堆的一个很重要的特性:根节点是堆里面数值最大的元素。所以,当元素45出堆后,剩下的元素中最大的元素必然要上浮到根节点的位置。因此,根据堆结构的这一出堆的性质,将一个堆结构所有元素全部出堆,就构成了一个有序列,即完成了排序的功能。

因此堆排序的核心其实是两步:将待排序数组构建为一个堆结构;2 将根节点出堆

仔细思考上面的两个步骤,本质上是两个相反的过程:将n个元素插入一个空堆;将这n个元素按照出堆原则出堆

在此,给出两个基本结论:将n个元素逐个插入到一个空堆中,算法复杂度是O(nlogn)。当然也可以采用heapify算法,将建堆过程的复杂度降低到O(n),该算法的核心思想是:直接对原数组进行结构调整,而且我们开始调整的位置从n/2-1.

至此,博客回答了前两个问题,后续问题会定期更新!

原文地址:https://www.cnblogs.com/shaonianpi/p/12044237.html

时间: 2024-10-10 07:35:04

排序系列之——再叙堆排序的相关文章

排序系列之——冒泡排序、插入排序、选择排序

排序之——冒泡排序: 基本思想:假设待排序表长为N,从后往前(或者从前往后)两两比较相邻元素的值,若为逆序(arr[i-1]>arr[i]),则交换他们,直到序列比较完.这时一趟冒泡. 代码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <time.h> 5 #define N 20 6 7 void print_Arr(int *arr,

白话经典算法系列之七 堆与堆排序

堆排序与高速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先解说下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是全然二叉树或者是近似全然二叉树. 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)不论什么一个子节点的键值. 2.每一个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆). 当父结点的键值总是大于或等于不论什么一个子节点的键值时为最大堆.当父结点的键值总是小于或等于不论什么一个子节点的键值时为最小堆.下图展示一个最小堆

白话经典算法系列之七 堆与堆排序(转)

堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先讲解下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是完全二叉树或者是近似完全二叉树. 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆). 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆.当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆.下图展示一个最小堆: 由于其它几

基本排序系列之计数排序

简述计数排序 看了好多别人写的计数排序,看了好久都没看懂,弄了好久最后发现这么简单居然花了几个小时,所以在这里写上,希望和我一样的初学者不会再绕弯路. 一.简述计数排序的思想: 设被排序的数组为A,排序后存储到B,C为临时数组.所谓计数,首先是通过一个数组C[i]计算大小等于i的元素个数,此过程只需要一次循环遍历就可以:在此基础上,计算小于或者等于i的元素个数,也是一重循环就完成.下一步是关键:逆序循环,从length[A]到1,将A[i]放到B中第C[A[i]]个位置上.原理是:C[A[i]]

基本排序系列之基数排序

基数排序 一.基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较. 其实现原理:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零.然后,从最低位开始,依次进行一次排序.这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列. 二.具体操作:此排序的真正实现是通过队列的装置,先进先出的原理,通过把个位,十位,百位,等其他进制也一样,放到不同的队列中(俗称桶)再按照先进先出的原理得到新的序列,在通过百位将其重新入桶回收等操

#排序算法#【3】堆排序

堆是一个完全二叉树,树中每个结点对应于原始数据的一个记录,并且每个结点应满足以下条件:非叶结点的数据大于或等于其左.右孩子结点的数据(若是按从大到小的顺序排序,则要求非叶结点的数据小于或等于其左.右孩子结点的数据). 由堆的定义可看出,其根结点为最大值,堆排序就是利用这一特点进行的.堆排序过程包括两个阶段: (1)将无序的数据构成堆(即用无序数据生成满足堆定义的完全二叉树). (2)利用堆排序(即用上一步生成的堆输出有序的数据). 加入有一组要排序的数据:69,65,90,37,92,6,28,

Oracle网络公开课《让我们捧起2014备份与恢复的世界之杯-再叙Recovery Catalog》

世界杯是全球各个国家在足球领域最梦寐以求的神圣荣耀,哪一支国家足球队能得到冠军,就是名正言顺的世界第一,整个世界都会为之疯狂沸腾.世界杯上发挥出色的球员都会被该国家奉为民族英雄永载史册,所以它亦代表了各个足球运动员的终极梦想. 玩转恢复目录,也是每个备份管理员的顶级追求,通过使用恢复目录可以将许多还原和恢复过程简化,从而缩短还原和恢复的时间.让我们一起轻松搞定所有数据库的备份信息的守候.监控和报告,一起来享受世界杯的比赛. 小贴士:世界杯(FIFA World Cup)即国际足联世界杯,是世界上

排序系列算法——堆排序

堆:大根堆与小根堆 堆排序是建立在堆基础上的排序方法,首先了解一下什么是堆. 常用的堆一般有两种,大根堆和小根堆.堆可以看做是一棵二叉树,其父节点的值总是大于(大根堆)或者小于(小根堆)子节点的值.举一个例子: 图1 不满足堆的条件                 图2大根堆                             图3 小根堆 图1不是堆,因为不满足父节点的值大于或者小于子节点的值: 图2是大根堆,根节点是最大值,父节点都大于或等于子节点的值: 图3是小根堆,根节点是最小值,父

【转】白话经典算法系列之七 堆与堆排序

堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先讲解下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是完全二叉树或者是近似完全二叉树. 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆). 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆.当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆.下图展示一个最小堆: 由于其它几