堆的相关算法

堆是一种特殊的二叉树。它具有下面两个性质:

1、每一个节点的值大于或等于其每一个子节点的值。

2、该树全然平衡,最后一层的叶子都处于最左側的位置。

有最大堆和最小堆之分。以上定义是最大堆的定义,最小堆的定义例如以下:

1、每一个节点的值小于或等于其每一个子节点的值;

2、该树全然平衡,最后一层的叶子都处于最左側的位置。

本文实现了堆的建立、删除、插入、堆排序。

本文中的样例以最大堆为例:

// heap_function.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

void swap(int *p, int *q)
{
	int temp = *p;
	*p = *q;
	*q = temp;
}

void MoveUp(int heap[],int start)//向上移动的操作,用于向堆中插入元素用//
{
	int i = start;
	int j = (i -1)/2;
	while(i>0)
	{
		if (heap[i] > heap[j])
		{
			swap(&heap[i],&heap[j]);
			i = j;
			j = (i-1)/2;
		}
		else
			break;
	}
}

void insert_ele(int heap[], int value, int &count)//向堆中插入元素,count为堆中元素的个数。//
{
	heap[count] = value;
	MoveUp(heap,count);
	count++;
}

void MoveDown(int heap[], int first, int last)
{
	int largest = 2*first+1;
	while(largest<= last)
	{
		if (largest<last && heap[largest] < heap[largest+1])
			largest = largest + 1;
		if (heap[largest] > heap[first])
		{
			swap(&heap[largest], &heap[first]);
			first = largest;
			largest = 2* largest + 1;
		}
		else
			largest = last + 1;
	}
}

void delete_ele(int heap[], int &count)//从堆中删除堆顶元素//
{
	heap[0] = heap[count-1];
	count--;
	MoveDown(heap,0,count-1);
}

void FloyAlgorithm(int heap[],int n)//从底到顶构建堆,n为元素个数//
{
	for (int i = n/2 -1; i >= 0; i --)
	{
		MoveDown(heap,i, n-1);
	}
}

void WilliamsAlgorithm(int heap[], int n)//从顶究竟构建堆,由John Williams提出//
{
	for (int i = 0; i < n; i ++)
	{
		MoveUp(heap,i);
	}
}

void heapsort(int heap[], int n)//堆排序
{
	for (int i = n/2 -1; i >=0; --i)
		MoveDown(heap,i,n-1);
	for (int i = n-1; i >=1; --i)
	{
		swap(&heap[0],&heap[i]);
		MoveDown(heap,0,i-1);
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	int data[9] = {2,8,6,1,10,15,3,12,11};
	//heapsort(data,9);
	//FloyAlgorithm(data,9);
	WilliamsAlgorithm(data,9);
	for (int i = 0; i < 9; ++i)
	{
		cout<<data[i]<<" ";
	}
	return 0;
}
时间: 2024-10-24 22:00:09

堆的相关算法的相关文章

【STL学习】堆相关算法详解与C++编程实现(Heap)

转自:https://blog.csdn.net/xiajun07061225/article/details/8553808 堆简介 堆并不是STL的组件,但是经常充当着底层实现结构.比如优先级队列(Priority Queue)等等. 堆是一种完全二叉树,因此我们可以用数组来存储所有节点.在这里的实现中,采用了一个技巧:将数组中索引为0的元素保留,设置为极大值或者为极小值(依据大顶堆或者小顶堆而定).那么当某个节点的索引是i时,其左子节点索引为2*i,右子节点索引为2*i+1.父节点是i/2

[java,2017-05-15] 内存回收 (流程、时间、对象、相关算法)

内存回收的流程 java的垃圾回收分为三个区域新生代.老年代. 永久代 一个对象实例化时 先去看伊甸园有没有足够的空间:如果有 不进行垃圾回收 ,对象直接在伊甸园存储:如果伊甸园内存已满,会进行一次minor gc:然后再进行判断伊甸园中的内存是否足够:如果不足 则去看存活区的内存是否足够:如果内存足够,把伊甸园部分活跃对象保存在存活区,然后把对象保存在伊甸园:如果内存不足,向老年代发送请求,查询老年代的内存是否足够:如果老年代内存足够,将部分存活区的活跃对象存入老年代.然后把伊甸园的活跃对象放

探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤(转)

第 2 部分: 深入推荐引擎相关算法 - 协同过滤 本系列的第一篇为读者概要介绍了推荐引擎,下面几篇文章将深入介绍推荐引擎的相关算法,并帮助读者高效的实现这些算法. 在现今的推荐技术和算法中,最被大家广泛认可和采用的就是基于协同过滤的推荐方法.它以其方法模型简单,数据依赖性低,数据方便采集 , 推荐效果较优等多个优点成为大众眼里的推荐算法“No.1”.本文将带你深入了解协同过滤的秘密,并给出基于 Apache Mahout 的协同过滤算法的高效实现.Apache Mahout 是 ASF 的一个

数据结构(C语言版)顺序栈相关算法的代码实现

这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的是从栈底想栈顶方向运行visit()函数,这是之前的学习中所忽略的:栈的遍历解除了栈的输出顺序只能从栈顶像栈底方向的限制. 二.清空栈时要不要将stacksize重置 网上看到有的人在实现清空栈这一功能时,将stacksize重置为0,我觉得有点问题,起初的想法是将其重置为初始化时的值,在与同学讨论

加密类型及其相关算法

在互联网通信过程中,如何保证数据的安全性? 在通信过程中,数据安全主要从三个方面考虑:机密性(数据的内容不能被窃取) 完整性(数据的内容不能被修改) 身份验证(确定通信双方的身份) 加密类型:1.对称加密,加密和解密使用同一个密钥,但是密钥如何安全传输比较重要,对称加密数度较快,适于加密数据 2.单向加密,提取数据指纹,主要用于保证数据的完整性 单向加密的特点:输入相同则输出一定相同 雪崩效应:输入的微小改变会引起结果的巨大反差 定长输出 3.非对称加密,使用一对密钥(public-key和pr

探索推荐引擎内部的秘密,第 3 部分: 深入推荐引擎相关算法 - 聚类

聚类分析 什么是聚类分析? 聚类 (Clustering) 就是将数据对象分组成为多个类或者簇 (Cluster),它的目标是:在同一个簇中的对象之间具有较高的相似度,而不同簇中的对象差别较大.所以,在很多应用中,一个簇中的数据对象可以被作为一个整体来对待,从而减少计算量或者提高计算质量. 其实聚类是一个人们日常生活的常见行为,即所谓"物以类聚,人以群分",核心的思想也就是聚类.人们总是不断地改进下意识中的聚类模式来学习如何区分各个事物和人.同时,聚类分析已经广泛的应用在许多应用中,包

linux学习之路之加密类型及其相关算法

加密类型及其相关算法 随着互联网越演越烈,互联网上的各种攻击层出不穷,因此在互联网上相互传递的信息越来越不安全,因此为了防止用户在互联网上传递的数据被窃取,因此我们很有必须加强传递的数据的安全性. 数据的安全性主要包括以下三个方面: 数据的机密性:保证传递的数据不被读取 要想使传递的数据不被读取,可以对这些数据进行加密,因为默认这些数据是以明文来传递的 整个加密过程可以这么来理解: 加密:plaintext--->转换规则--->ciphertext 解密:ciphertext--->转

二分查找的相关算法题

最近笔试经常遇到二分查找的相关算法题 1)旋转数组中的最小数字 2)在旋转数组中查找某个数 2)排序数组中某个数的出现次数 下面我来一一总结 1 旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 实现数组的旋转见左旋转字符串. 和二分查找法一样,用两个指针分别指向数组的第一个元素和最后一个元素. 我们注意到旋转

深入推荐引擎相关算法 - 协同过滤

集体智慧和协同过滤 什么是集体智慧 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web 应用中利用集体智慧构建更加有趣的应用或者得到更好的用户体验.集体智慧是指在大量的人群的行为和数据中收集答案,帮助你对整个人群得到统计意义上的结论,这些结论是我们在单个个体上无法得到的,它往往是某种趋势或者人群中共性的部分. Wikipedia 和 Google 是两个典型的利用集体智慧的 Web 2.0 应用: Wikip