zoukankan      html  css  js  c++  java
  • 堆的相关算法

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

    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;
    }
    


  • 相关阅读:
    【洛谷P3469】[POI2008]BLO-Blockade
    【洛谷P3225】[HNOI2012]矿场搭建
    【洛谷P4568】[JLOI2011]飞行路线
    读入优化与输出优化模板
    7.29NOIP模拟赛
    【洛谷P3627】[APIO2009]抢掠计划
    【洛谷P1582】倒水
    运lucky
    【数据结构】浅谈倍增求LCA
    【题解】洛谷P4180 [BJWC2010] 严格次小生成树(最小生成树+倍增求LCA)
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6791465.html
Copyright © 2011-2022 走看看