数据结构:大堆

#include <iostream>
using namespace std;

class Heap
{
public:
	Heap() :size(0), arr(NULL){}
	void Insert(int a[],int n)
	{
		arr = new int[n];
		for (int i = 0; i < n; i++)
		{
			arr[i] = a[i];
		}
		size = n;

		n = size / 2;
		while (n >= 0)
		{
			SetArr(arr,n);
			n--;
		}
	}
	void Sort()//排序。
	{
		while (size > 0)
		{
			int temp = arr[0];
			arr[0] = arr[size - 1];
			arr[size - 1] = temp;
			size--;
			SetArr(arr, 0);
		}
	}
	void Printf(int n)
	{
		for (int i = 0; i < n; i++)
		{
			cout << arr[i] << " ";
		}
		cout << endl;
	}
private:
	void SetArr(int a[], int n)//调整。
	{
		int i = n;
		int j = i * 2 + 1;
		while (j < size)
		{
			if (j + 1 < size && arr[j] < arr[j + 1])
				j++;
			if (arr[i] < arr[j])
			{
				int temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
			i = j;
			j = i * 2 + 1;
		}
	}

private:
	int size;
	int *arr;
};
int main()
{
	int a[] = {7,6,54,3,5,6,8,9,3,2,1,3,4,6,5555,3,2213,4};
	Heap hp;
	hp.Insert(a,sizeof(a)/sizeof(int));
	hp.Sort();
	hp.Printf(sizeof(a)/sizeof(int));
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 11:43:44

数据结构:大堆的相关文章

数据结构-最大堆、最小堆【手动实现】

0,堆的简介 数据结构中的堆是一种特殊的二叉树,不同于 Java 内存模型中的堆. 堆必须符合以下两个条件: 是一棵完全二叉树. 任意一个节点的值都大于(或小于)左右子节点的值. 从第一点可以知道,堆适合用数组来存储. 第二点中,若父节点都大于等于左右子节点,则被称为大顶堆,反之则为小顶堆. 图-最大堆及其存储方式 0.1节点的父.子节点关系 一个节点[根节点除外]的父节点地址为其地址的二分之一,它的左子节点地址为其地址值的2倍,右子节点地址为其地址2倍加1.  例如:现在有个节点的地址为3,其

数据结构c++语言描述&mdash;&mdash;最大堆(MaxHeap)

一.最大堆的插入 图9-3a 给出了一个具有5个元素的最大堆.由于堆是完全二叉树,当加入一个元素形成6元素堆时,其结构必如9-3b 所示.如果插入元素的值为1,则插入后该元素成为2的左孩子,相反,若新元素的值为5,则该元素不能成为2的左孩子(否则将改变最大树的特性),应把2下移为左孩子(如图9 - 3 c所示),同时还得决定在最大堆中5是否占据2原来的位置.由于父元素20大于等于新插入的元素5,因此可以在原2所在位置插入新的元素.假设新元素的值为21而不是5,这时,同图9-3c 一样,把2下移为

python数据结构与算法——完全树 与 最小/大堆

1 # 完全树 最小堆 2 class CompleteTree(list): 3 def siftdown(self,i): 4 """ 对一颗完全树进行向下调整,传入需要向下调整的节点编号i 5 当删除了最小的元素后,当新增加一个数被放置到堆顶时, 6 如果此时不符合最小堆的特性,则需要将这个数向下调整,直到找到合适的位置为止""" 7 n = len(self) 8 # 当 i 节点有儿子(至少是左儿子时),并且有需要调整时,循环执行 9

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

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

SPL标准库-数据结构

数据结构:栈 $stack = new SplStack();$stack->push("data1\n");$stack->push("data2\n");echo $stack->pop();echo $stack->pop(); 数据结构:队列 $queue = new SplQueue();$queue->enqueue("data1\n");$queue->enqueue("data2\n&

数据结构基础知识1

一. 理解并能快速.准确写出代码.(★★★★★) 1. 几种常见排序( 代码 ) 基于比较的排序算法: 下界是 nlgn 1.1 SelectionSort:每次选出最下的元素,放在当前循环最左边的位置. 1.2 BubbleSort:每次比较相邻的两个数,使得最大的数像气泡一样冒到最右边. 1. 3 InsertionSort:每次拿起一个数,插入到它左边数组的正确位置. 1.4 QuickSort:选择一个数,作为标准,小于它的放在左边,大于它的放在右边.并把它放在中间:递归地对左右子数组进

【数据结构】堆的实现(包括:默认成员函数,插元素push,删元素pop,访问根节点top,判空,大小)

在数据结构里,堆是一类很重要的结构.堆结构是一组数组对象,我们可以把它当作是一颗完全二叉树. 最大堆:堆里每一个父亲节点大于它的子女节点. 最小堆:堆里每一个父亲节点小于它的子女节点. 如图就是一个最大堆: 实现代码时我的测试序列是:int a[] = { 10, 11, 13, 12, 16, 18, 15, 17, 14, 19 }; 我们把它的图画出来,便于分析. 实现代码如下: 建立头文件heap.hpp #define _CRT_SECURE_NO_WARNINGS 1 #includ

数据结构杂谈(一)浅谈基本排序算法

0.基本概念 记录:待排序的项目 关键词:决定排序结果 稳定性:相同关键词的记录保持原来的相对次序 1.1插入排序(Insertion Sort) 算法思想 一种简单直观的排序算法,工作原理是通过构建有序序列:对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法描述 具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序的元素小于或者等于

数据结构学习——二叉堆ADT(程序化)

参考书籍<数据结构与算法分析--C语言描述> 关于堆的一些基本概念,可参见小zz的另一篇博文. /*本例程实现的是最小堆,最大堆类似*/ #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> #define MAX 13 typedef struct BHeap { int Capacity;//堆的最大容量 int Size;//当前堆大小 int