建堆[HihoCoder-1405]

Building Heap HihoCoder-1405

hihoCoder太阁最新面经算法竞赛11

问题大意:给定一个$N$个元素的数组$A$(元素互不相同),要求你建立满足下列要求的二叉树$T$,并输出其前序遍历:

1)$T$满足最小堆性质;

2)输入的数组$A$满足$T$的中序遍历。

这是一道数据结构基础题,主要是解决如何建堆。题目要求最小堆,其树根必然是整个树的最小值。因此在建堆过程中,只需寻找最小值,根据找到的最小值的位置将中序遍历的序列一分为二,继续对这两个子序列建堆,直到子序列没有元素为止。利用递归很容易写出程序。这道题要求输出前序遍历结果,因此可以不用实际建堆而直接在建堆的同时输出即可。时间复杂度为$O(n\rm{log}n)$。

 1 #include<iostream>
 2 using namespace std;
 3 template<typename T>
 4 int findmin(T A[], int size)
 5 {
 6     int min = 0;
 7     for (int i = 1; i < size; i++)
 8         if (A[i] < A[min])
 9             min = i;
10     return min;
11 }
12 void bheap(int A[], int size)
13 {
14     int minpos = findmin(A, size);
15     cout << A[minpos] << " ";
16     if (minpos!=0)
17         bheap(A, minpos);
18     if (minpos != size - 1)
19         bheap(A + minpos + 1, size - minpos - 1);;
20 }
21 int main()
22 {
23 #define TMAX 150
24     int A[TMAX];
25     int n;
26     cin >> n;
27     for (int i = 0; i < n; i++)
28         std::cin >> A[i];
29     bheap(A, n);
30     return 0;
31 }
时间: 2024-10-11 16:55:16

建堆[HihoCoder-1405]的相关文章

建堆,以及对堆排序

建堆,以及堆排序 代码1: #include<stdio.h> int h[101];//用来存放堆的数组 int n;//用来存储堆中元素的个数,就是堆的大小 //交换函数,用来交换堆中的俩个元素的值 void swap(int x,int y) { int t; t=h[x]; h[x]=h[y]; h[y]=t; } //向下调整函数 void siftdown(int i) {//传入一个须要向下调整的的节点编号i,这里传入1.即从堆的顶点開始向下调整 int t,flag=0;//f

Python3实现最小堆建堆算法

今天看Python CookBook中关于“求list中最大(最小)的N个元素”的内容,介绍了直接使用python的heapq模块的nlargest和nsmallest函数的解决方式,记得学习数据结构的时候有个堆排序算法,所以顺便研究了一下“堆”结构(这里特指二叉堆). 概念 所谓二叉堆(binary heap)实际上就是一颗特殊的完全二叉树,其特殊性在于: 二叉树中所有的父节点的值都不大于/不小于其子节点: 根节点的值必定是所有节点中最小/最大的. 父节点值不大于子节点且根节点值最小称为最小堆

建堆复杂度O(n)证明

堆排序中首先需要做的就是建堆,广为人知的是建堆复杂度才O(n),不过很少有人去了解过这个复杂度的证明过程,因为不是那么直观地可以一眼就看出来.本文不讲堆排序,只单纯讲建堆过程. 建堆代码 欲了解复杂度的计算过程,必先看懂建堆代码.先看这个建堆过程 // 将arr[n]向上调整至合适位置 void AdjustHeap(vector<int> &arr, int n) { if(n<=0) return ; if(arr[(n-1)/2] > arr[n]) { //与父结点

堆+建堆、插入、删除、排序+java实现

package testpackage; import java.util.Arrays; public class Heap { //建立大顶堆 public static void buildMaxHeap(int[] a) { for(int i=(a.length/2)-1;i>=0;i--) { adjustDown(a,i,a.length); } } //向下调整 public static void adjustDown(int[] a,int i,int len) { int

自下而上建堆(heap)的时间复杂度证明

作者:Tobin 日期:2019/04/13 缘由:看python cookbook时,用到了heapq的库,书中提到,如果仅仅是返回一个数组的最大值,用max就可以了,但是如果返回多个较大或者较小元素用堆,如果返回的个数接近于数组本身的元素个数时,直接用排序即可.那么我在想,为啥返回几个元素的时候用堆效果比较好呢?于是我翻开了尘封许久的<算法导论>. 什么是堆 堆是一种数据结构.二叉堆是一个数组,近似于一个完全二叉树.树上的每个结点对应于数组的一个元素,除了最底层外树是充满的.下面的图是一个

数据结构中的堆

一:堆排序      堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种.可以利用数组的特点快速定位指定索引的元素.堆分为大根堆和小根堆,是完全二叉树.大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i].在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶.下面附上简单C#简单实现: using System; using System.Collections.Generi

【堆】

看上去好像很简单的样子··然后折磨了我好久···· 主要是没仔细弄明白. 堆分为最小堆和最大堆,以二叉树的形式存在,最小堆即根节点为整个树的最小值,最大堆则是根节点为最大值. 建堆(以最大堆为例): 首先数据以数组形式存储(int a[]或vector<int> a),若二叉树的根节点从0开始计数,则节点 i 的左右子节点的下标分别为2 * i + 1和 2 * i + 2(忘了怎么算可以画一棵树,就知道了). void heap_down(int a[], int id, int numsS

《ACM/ICPC 算法训练教程》读书笔记一之数据结构(堆)

书籍简评:<ACM/ICPC 算法训练教程>这本书是余立功主编的,代码来自南京理工大学ACM集训队代码库,所以小编看过之后发现确实很实用,适合集训的时候刷题啊~~,当时是听了集训队final的意见买的,感觉还是不错滴. 相对于其他ACM书籍来说,当然如书名所言,这是一本算法训练书,有着大量的算法实战题目和代码,尽管小编还是发现了些许错误= =,有部分注释的语序习惯也有点不太合我的胃口.实战题目较多是比较水的题,但也正因此才能帮助不少新手入门,个人认为还是一本不错的算法书,当然自学还是需要下不少

二叉堆(binary heap)

堆(heap) 亦被称为:优先队列(priority queue),是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因而实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权.堆即为解决此类问题设计的一种数据结构. 本文地址:http://www.cnblogs.com/archimedes/p/binary-heap.html,转载请注明源地址. 逻辑定义 n个