基于完全二叉树的极大堆的上下漂移实现

 1 //基于完全二叉树的极大堆的上下漂移实现
 2 //INT_MAX极大数 INT_MIN极小数
 3 #include <cstdlib>
 4 #include <iostream>
 5 #include <vector>
 6 #define N 11
 7
 8 using namespace std;
 9
10 typedef int  T;     //!!!!!!!
11 typedef vector<T>::iterator TP;//!!!!!
12
13 void shiftup(TP a,int n){
14      for(int p=n/2;p>0&&(a[p]<a[n]);p=(n=p)/2)//向量可以这样索引
15       std::swap(a[p],a[n]);
16 }
17
18
19 void shiftdown(TP a,int n){
20      for(int p=1,bc=2;bc<=n;bc=2*p){
21        if(bc<n&&(a[bc]<a[bc+1])) ++bc;
22        if(a[p]<a[bc]) {std::swap(a[bc],a[p]);p=bc;}
23        else break;
24              }
25      }
26
27
28
29
30  int main(){
31  vector<int> vv;
32  vv.reserve(2*N);
33 vv.push_back(INT_MAX); //INT_MAX极大数 INT_MIN极小数
34  //vv[0]=INT_MAX;//!!!
35  //cout<<vv[0]<<endl;
36  //system("PAUSE");
37 //    return 1;
38  //for(int i=1;i<21;i++)
39  vv.push_back(88);
40  vv.push_back(75);
41  vv.push_back(83);
42  vv.push_back(65);
43  vv.push_back(55);
44  vv.push_back(63);
45  vv.push_back(53);
46  vv.push_back(45);
47  vv.push_back(35);
48  //vv[2]=14;//用地址+【】进行索引
49  TP first=vv.begin();
50  //!!!定义向量的指针用该语句,而非用取地址符号来定义
51 //cout<<vv[0]<<endl;
52 for(int i=0;i<N-1;i++)
53    cout<<vv[i]<<endl;
54
55  int o=91;
56 //极大堆的shiftup操作实现
57 cout<<"now add value to MAX_HEAP:"<<o<<endl;
58 vv.push_back(o);
59 shiftup(first,N-1);
60 cout<<"after shiftup operation:"<<endl;
61 for(int i=0;i<N;i++)
62    cout<<vv[i]<<endl;
63
64 std::swap(vv[N-1],vv[1]);
65 shiftdown(first,N-1);
66 cout<<"after shiftdown operation:"<<endl;
67    for(int i=0;i<N;i++)
68    cout<<vv[i]<<endl;
69
70     system("PAUSE");
71     return 1;
72 }
73
74  
时间: 2024-10-29 19:11:39

基于完全二叉树的极大堆的上下漂移实现的相关文章

基于requests实现极客学院课程爬虫

背景 本文主要是为了完成极客学院课程<Python 单线程爬虫>中讲师布置的实战作业. 开发环境 操作系统:windows 10 Python :Python 2.7 IDE:PyCharm 4.5.3 安装requests 在CMD命令提示窗口敲以下一行命令即可安装. pip install requests 实现代码 # coding=utf-8 __author__ = 'scaleworld' import requests import re import sys reload(sy

基于代码生成器的快速开发框架,spring mvc html5 bootstrap java框架,jeeplus框架源码下载

开源网址:http://www.jeeplus.org JeePlus是一款基于代码生成器的智能快速开发平台,可以帮助解决java项目中80%的重复工作,让开发者更多关注业务逻辑.既能快速提高开发效率,帮助公司节省人力成本,同时不失灵活性. JeePlus快速开发宗旨是:简单功能由代码生成器生成使用,复杂业务采用表单自定义,只需要写极少代码,即可实现复杂的业务逻辑. JeePlus采用了目前极为流行的扁平化响应式的设计风格,可以完美兼容电脑,pad,手机等多个平台.前端UI采用INSPINA实现

STL之堆操作

首先来看完全二叉树的定义: 若设二叉树的深度为h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树.而将一维数组视为完全二叉树书得到的即为堆. 堆效率极高,像十分常用的排序算法.Dijkstra算法.Prim算法等都要用堆才能优化,几乎每次都要考到的二叉排序树的效率也要借助平衡性来提高,而平衡性基于完全二叉树. STL中与堆相关的4个函数--建立堆make_heap(),在堆中添加数据push_heap(),在堆中删除数据

堆排序(概念、原理、实现)

完全二叉树的定义.性质以及算法见正文,这里补充一点:完全二叉树是效率很高的数据结构,堆是一种完全二叉树或者近似完全二叉树,所以效率极高,像十分常用的排序算法.Dijkstra算法.Prim算法等都要用堆才能优化,几乎每次都要考到的二叉排序树的效率也要借助平衡性来提高,而平衡性基于完全二叉树. 1 判断完全二叉树 完全二叉树:除最后一层外,每一层上的结点数均达到最大值:在最后一层上只缺少右边的若干结点. 2 完全二叉树定义 完全二叉树(Complete Binary Tree) 若设二叉树的深度为

(考研)(精华)二叉树的知识结构图以及各种特殊的二叉树

关于二叉树有一点需要注意:二叉树并不是树的一种特殊形式. 二叉树又有几种特殊的形式:二叉排序树(二叉查找树).最优二叉树(哈弗曼树).二叉堆(大顶堆,小顶堆)等.斜线是数据结构 二叉排序树(二叉查找树)(BST)它或者是一棵空树:或者是具有下列性质的二叉树:(常用二分查找) 1,若左子树不空,则左子树上所有结点的值均小于它的根结点的值: 2,若右子树不空,则右子树上所有结点的值均大于它的根结点的值: 3,左.右子树也分别为二叉排序树: 特有的性质:对于每个结点,左孩子均小于它,右孩子均大于它 A

堆排序之Java实现

堆排序思想: 堆排序,顾名思义,就是基于堆.堆分为最大堆和最小堆,其实就是完全二叉树.最大堆要求节点的元素都要大于其孩子,最小堆要求节点元素都小于其左右孩子,两者对左右孩子的大小关系不做任何要求,其实很好理解.有了上面的定义,我们可以得知,处于最大堆的根节点的元素一定是这个堆中的最大值.其实我们的堆排序算法就是抓住了堆的这一特点,每次都取堆顶的元素,将其放在序列最后面,然后将剩余的元素重新调整为最大堆,依次类推,最终得到排序的序列. 或者说,堆排序将所有的待排序数据分为两部分,无序区和有序区.无

Python常用算法

本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题.不同的算法可能用不同的时间.空间或效率来完成同样的任务.一个算法的优劣可以用空间复杂度与时间复杂度来衡量. 一个算法应该具有以下七个重要的特征: ①有穷性(Fin

几种排序算法的C++实现——快速排序、堆排序、基数排序

排序算法是非常常见的面试笔试问题,考查的一个人的基本功,本文将一些排序做了C++的实现,就当是做个学习总结吧. 1.快速排序 快速排序的中心是填坑法,取一个数(这里选取第一个数)作为基准数temp,从队尾开始寻找第一个比基准数小的数a[j],交换a[j]和temp,然后队首开始查找第一个比temp大的数a[i],交换之,遍历的结果是当i>=j时,temp左边的数都小于temp,后边的数都大于temp,这个有点像归并排序.最后利用递归调用完成排序,代码如下: 1 void QuickSort(in

Python之路,Day21 - 常用算法学习

Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题.不同的算法可能用不同的时间.空间或效率来完成同样的任务.一个算法的优劣可以用空间复杂度与时间复杂度来衡量. 一个算