堆排序+代码实现

堆排序

堆,heap,是二叉树的一种。小根堆有这样的性质——任意一个结点的值比它的左右孩子都要小。

排序思想

将待排元素看作是完全二叉树,物理上用一维数组存储。

实现堆排序需要解决两个问题:

1.如何将杂乱的完全二叉树初始化为一个堆?

答:从最后一个非叶结点起,将该节点当做根,自上而下进行调整,使之成为一个堆。然后依次对倒数第二个、倒数第三个、直至正数第一个结点进行此操作。

2.输出堆顶元素后,如何将余下的元素调整为一个堆?

答:将最后一个结点放在原根结点位置上,以它为根进行上述的调整。

复杂度分析。

二叉树的层数计算方法,从上往下,1,2,3,4......

耗时的操作有构造初始堆和调整堆两部分。

对深度为h的堆进行自上而下的调整,最多比较次数为2*(h-1)。

在初始化堆的过程中,完全二叉树的高度为h,总的比较次数为

 

综上,堆排序在复杂度最坏的情况下为O((1)式+(2)式)=O(n*logn)。

代码

初始序列为1 8 6 2 5 4 7 3一组数采用堆排序,当建堆(小根堆)完毕时,堆所对应的二叉树中序遍历序列为:(A)

A.8 3 2 5 1 6 4 7  B.3 2 8 5 1 4 6 7  C.3 8 2 5 1 6 7 4 
D.8 2 3 5 1 4 7 6

时间: 2024-09-28 23:29:19

堆排序+代码实现的相关文章

图文详解Heap Sort堆排序算法及JavaScript的代码实现_基础知识

1. 不得不说说二叉树要了解堆首先得了解一下二叉树,在计算机科学中,二叉树是每个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用于实现二叉查找树和二叉堆. 二叉树的每个结点至多只有二棵子树(不存在度大于 2 的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第 i 层至多有 2i - 1 个结点:深度为 k 的二叉树至多有 2k - 1 个结点:对任何一棵二叉树 T,如果其

堆排序中数组溢出问题

问题描述 堆排序中数组溢出问题 堆排序代码,没有编译错,运行不起来,我估计是数组溢出了,但是看不出错误在哪里? #include<stdio.h> #include<stdlib.h> void exchange(int* a,int* b){ int t=*a; *a=*b; *b=t; } void Maxheap(int A[],int i,int size){ int l=2*i; int r=2*i+1; int largest; if(A[l]>A[i]&

C语言 奇偶排序算法详解及实例代码_C 语言

C语言奇偶排序算法 奇偶排序,或奇偶换位排序,或砖排序,是一种相对简单的排序算法,最初发明用于有本地互连的并行计算.这是与冒泡排序特点类似的一种比较排序.该算法中,通过比较数组中相邻的(奇-偶)位置数字对,如果该奇偶对是错误的顺序(第一个大于第二个),则交换.下一步重复该操作,但针对所有的(偶-奇)位置数字对.如此交替进行下去. 使用奇偶排序法对一列随机数字进行排序的过程 处理器数组的排序 在并行计算排序中,每个处理器对应处理一个值,并仅有与左右邻居的本地互连.所有处理器可同时与邻居进行比较.交

堆排序算法(选择排序改进)_C 语言

首先要理解堆的含义:要么所有节点都不大于其子孩子节点数据,要么都不小于其子孩子节点数据 堆排序的核心思想:就是要满足所有节点都满足上面两点,如何完成,看下面 堆排序的步骤: 1.首先要建成一个大顶堆或者小顶堆,在建的过程中其实就是调整节点的位置,首先要从最后最后一个节点的母亲节点开始,按照堆的含义调整.为什么不是最后一个或者其他?因为要保证完整性和不必要性,所以只需从最后一个的母亲节点开始即可(下面的堆默认存在顺序结构,从索引0开始的,所以有些二叉树的特性请查阅二叉树),直至索引节点为0的节点.

C++计数排序详解_C 语言

计数排序不同于比较排序,是基于计数的方式,对于计数排序,假设每一个输入都是介于0~k之间的整数.对于每一个输入元素x,确定出小于x的元素的个数.假如有17个元素小于x,则x就属于第18个输出位置. 计数排序涉及到三个数组A[0-..length-1],length为数组A的长度:数组B与数组A长度相等,存放最终排序的结果:C[0-..K]存放A中每个元素的个数,k为数组A中的最大值. int count_k(int A[],int length),此函数为了确定数组A中最大的元素,用来确定C数组

深入解析堆排序的算法思想及Java代码的实现演示_java

一.基础知识我们通常所说的堆是指二叉堆,二叉堆又称完全二叉树或者叫近似完全二叉树.二叉堆又分为最大堆和最小堆. 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法,它是选择排序的一种.可以利用数组的特点快速定位指定索引的元素.数组可以根据索引直接获取元素,时间复杂度为O(1),也就是常量,因此对于取值效率极高. 最大堆的特性如下: 父结点的键值总是大于或者等于任何一个子节点的键值 每个结点的左子树和右子树都是一个最大堆 最小堆的特性如下: 父结点的键值总是小于或者等于任何一个子

C语言对堆排序一个算法思路和实现代码_C 语言

算法思想简单描述: 堆排序是一种树形选择排序,是对直接选择排序的有效改进. 堆的定义如下:具有n个元素的序列(h1,h2,...,hn),当且仅当满足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1)(i=1,2,...,n/2)时称之为堆.在这里只讨论满足前者条件的堆. 由堆的定义可以看出,堆顶元素(即第一个元素)必为最大项.完全二叉树可以很直观地表示堆的结构.堆顶为根,其它为左子树.右子树. 初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的

详解堆排序算法原理及Java版的代码实现_java

概述堆排序是一种树形选择排序,是对直接选择排序的有效改进. 堆的定义如下:具有n个元素的序列(k1,k2,...,kn), 当且仅当满足: 时称之为堆.由堆的定义可以看出,堆顶元素(即第一个元素)必为最小项(小顶堆)或最大项(大顶堆). 若以一维数组存储一个堆,则堆对应一棵完全二叉树,且所有非叶结点(有子女的结点)的值均不大于(或不小于)其子女的值,根结点(堆顶元素)的值是最小(或最大)的. (a)大顶堆序列:(96, 83, 27, 38, 11, 09) (b)小顶堆序列:(12, 36,

php堆排序实现原理与应用程序代码

author:        lajabs email:        agl0dhlvqgdtywlslmnvbq== 本文以php作为描述语言较详细讲解堆排序原理 因保证程序可读性,故不做优化. php程序中关于堆的一些概念: 假设n为当前数组的key则 n的父节点为 n>>1 或者 n/2(整除); n的左子节点l= n<<1 或 l=n*2,n的右子节点r=(n<<1)+1 或 r=l+1 */ $arr=array(1,8,7,2,3,4,6,5,9); /*